From dfa5facee2cc3dd4d66f2397911526770df7cb22 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 11 May 2001 17:40:38 +0000 Subject: [PATCH] Convertiti (spero) tutti i prototipi delle funzioni al nuovo environment... --- elemtcp.tex | 51 +++++++++++++++++++++------------------------ main.tex | 2 +- network.tex | 2 ++ socket.tex | 60 ++++++++++++++++++++--------------------------------- 4 files changed, 50 insertions(+), 65 deletions(-) diff --git a/elemtcp.tex b/elemtcp.tex index d317883..5e5a69c 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -35,7 +35,7 @@ verifica utilizzando il codice dei due precedenti esempi elementari \figref{fig:net_cli_code} e \figref{fig:net_serv_code}) che porta alla creazione di una connessione è la seguente: -\begin{itemize} +\begin{enumerate} \item Il server deve essere preparato per accettare le connessioni in arrivo; il procedimento si chiama \textsl{apertura passiva} del socket (in inglese \textit{passive open}); questo viene fatto chiamando la sequenza di funzioni @@ -71,7 +71,7 @@ creazione di una connessione \texttt{SYN} del server inviando un \texttt{ACK}. Alla ricezione di quest'ultimo la funzione \texttt{accept} del server ritorna e la connessione è stabilita. -\end{itemize} +\end{enumerate} Il procedimento viene chiamato \textit{three way handshake} dato che per realizzarlo devono essere scambiati tre segmenti. In \nfig\ si è @@ -186,7 +186,7 @@ seguente: \item Dopo un certo tempo anche il secondo processo chiamerà la funzione \texttt{close} sul proprio socket, causando l'emissione di un altro segmento FIN. - + \item L'altro capo della connessione riceverà il FIN conclusivo e risponderà con un ACK. \end{enumerate} @@ -248,21 +248,21 @@ riferimento resta (FIXME citare lo Stevens); qui ci limiteremo a descrivere brevemente un semplice esempio di connessione e le transizioni che avvengono nei due casi appena citati (creazione e terminazione della connessione). -In assenza di connessione lo stato del TCP è \textsl{CLOSED}; quando una +In assenza di connessione lo stato del TCP è \texttt{CLOSED}; quando una applicazione esegue una apertura attiva il TCP emette un SYN e lo stato -diventa \textsl{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK -emette un ACK e passa allo stato \textsl{ESTABLISHED}; questo è lo stato +diventa \texttt{SYN\_SENT}; quando il TCP riceve la risposta del SYN$+$ACK +emette un ACK e passa allo stato \texttt{ESTABLISHED}; questo è lo stato finale in cui avviene la gran parte del trasferimento dei dati. Dal lato server in genere invece il passaggio che si opera con l'apertura -passiva è quello di portare il socket dallo stato \textsl{CLOSED} allo -stato \textsl{LISTEN} in cui vengono accettate le connessioni. +passiva è quello di portare il socket dallo stato \texttt{CLOSED} allo +stato \texttt{LISTEN} in cui vengono accettate le connessioni. -Dallo stato \textsl{ESTABLISHED} si può uscire in due modi; se un'applicazione +Dallo stato \texttt{ESTABLISHED} si può uscire in due modi; se un'applicazione chiama la \texttt{close} prima di aver ricevuto un end of file (chiusura -attiva) la transizione è verso lo stato \textsl{FIN\_WAIT\_1}; se invece -l'applicazione riceve un FIN nello stato \textsl{ESTABLISHED} (chiusura -passiva) la transizione è verso lo stato \textsl{CLOSE\_WAIT}. +attiva) la transizione è verso lo stato \texttt{FIN\_WAIT\_1}; se invece +l'applicazione riceve un FIN nello stato \texttt{ESTABLISHED} (chiusura +passiva) la transizione è verso lo stato \texttt{CLOSE\_WAIT}. In \nfig\ è riportato lo schema dello scambio dei pacchetti che avviene per una un esempio di connessione, insieme ai vari stati che il protocollo viene @@ -292,7 +292,7 @@ risposta. Infine si ha lo scambio dei quattro segmenti che terminano la connessione secondo quanto visto in \secref{sec:TCPel_conn_term}; si noti che il capo della connessione che esegue la chiusura attiva entra nello stato -\textsl{TIME\_WAIT} su cui torneremo fra poco. +\texttt{TIME\_WAIT} su cui torneremo fra poco. È da notare come per effettuare uno scambio di due pacchetti (uno di richiesta e uno di risposta) il TCP necessiti di ulteriori otto segmenti, se invece si @@ -339,16 +339,16 @@ pi Ogni implementazione del TCP deve scegliere un valore per la MSL (l'RFC1122 raccomanda 2 minuti, linux usa 30 secondi), questo comporta una durata dello -stato \textsl{TIME\_WAIT} che a seconda delle implementazioni può variare fra +stato \texttt{TIME\_WAIT} che a seconda delle implementazioni può variare fra 1 a 4 minuti. Lo stato \texttt{TIME\_WAIT} viene utilizzato dal protocollo per due motivi principali: -\begin{itemize} +\begin{enumerate} \item implementare in maniera affidabile la terminazione della connessione in entrambe le direzioni. \item consentire l'eliminazione dei segmenti duplicati dalla rete. -\end{itemize} +\end{enumerate} Il punto è che entrambe le ragioni sono importanti, anche se spesso si fa riferimento solo alla prima; ma è solo se si tiene conto della seconda che si @@ -636,8 +636,7 @@ ci si porr Il prototipo della funzione, definito in \texttt{sys/socket.h}, è il seguente: -\begin{itemize} -\item \texttt{int bind(int sockfd, const struct sockaddr *serv\_addr, +\begin{prototype}{int bind(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen) } Il primo argomento è un file descriptor ottenuto da una precedente chiamata @@ -648,15 +647,14 @@ Il prototipo della funzione, definito in \texttt{sys/socket.h}, La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: - \begin{itemize} + \begin{errlist} \item \texttt{EBADF} Il file descriptor non è valido. \item \texttt{EINVAL} Il socket ha già un indirizzo assegnato. \item \texttt{ENOTSOCK} Il file descriptor non è associato ad un socket. \item \texttt{EACCESS} Si è cercato di usare un indirizzo riservato senza essere root. - \end{itemize} - -\end{itemize} + \end{errlist} +\end{prototype} Con il TCP la chiamata \texttt{bind} permette di specificare l'indirizzo, la porta, entrambi o nessuno dei due. In genere i server utilizzano una porta @@ -718,8 +716,7 @@ La funzione \texttt{connect} connessione con un server TCP, il prototipo della funzione, definito in \texttt{sys/socket.h}, è il seguente: -\begin{itemize} -\item \texttt{int connect(int sockfd, const struct sockaddr *serv\_addr, +\begin{prototype}{int connect(int sockfd, const struct sockaddr *serv\_addr, socklen\_t addrlen) } Il primo argomento è un file descriptor ottenuto da una precedente chiamata @@ -730,7 +727,7 @@ connessione con un server TCP, il prototipo della funzione, definito in La funzione restituisce zero in caso di successo e -1 per un errore, in caso di errore. La variabile \texttt{errno} viene settata secondo i seguenti codici di errore: - \begin{itemize} + \begin{errlist} \item \texttt{EBADF} Il file descriptor non è valido. \item \texttt{EFAULT} L'indirizzo della struttura di indirizzi è al di fuori dello spazio di indirizzi dell'utente. @@ -751,8 +748,8 @@ connessione con un server TCP, il prototipo della funzione, definito in \item \texttt{EACCESS, EPERM} Si è tentato di eseguire una connessione ad un indirizzo broacast senza che il socket fosse stato abilitato per il broadcast. - \end{itemize} -\end{itemize} + \end{errlist} +\end{prototype} La struttura dell'indirizzo deve essere inizializzata con l'indirizzo IP e il numero di porta del server a cui ci si vuole connettere, come mostrato diff --git a/main.tex b/main.tex index 603ed56..213648c 100644 --- a/main.tex +++ b/main.tex @@ -4,7 +4,7 @@ %% S. Piccardi Feb. 2001 %% %% main.tex: file principale, gli altri vanno inclusi da questo. -%% +%% \documentclass[a4paper,11pt,twoside,italian]{book} \usepackage[latin1]{inputenc} \usepackage{booktabs} diff --git a/network.tex b/network.tex index dc24c66..a1c04b7 100644 --- a/network.tex +++ b/network.tex @@ -778,6 +778,7 @@ loro origini ed alle eventuali implicazioni che possono avere: \begin{table}[!htb] \centering \begin{tabular}[c]{|l|c|} + \hline \textbf{Rete} & \textbf{MTU} \\ \hline Hyperlink & 65535 \\ @@ -786,6 +787,7 @@ loro origini ed alle eventuali implicazioni che possono avere: FDDI & 4532 \\ Ethernet & 1500 \\ X.25 & 576 \\ + \hline \end{tabular} \caption{Valori della MTU (\textit{maximum tranfer unit}) per una serie di reti diverse.} diff --git a/socket.tex b/socket.tex index 86c0b71..4f18f9f 100644 --- a/socket.tex +++ b/socket.tex @@ -82,14 +82,13 @@ definisce lo stile di comunicazione vedi \secref{sec:sock_type}) e il protocollo; in genere quest'ultimo è indicato implicitamente dal tipo di socket, per cui viene messo a zero (con l'eccezione dei \textit{raw socket}). -\begin{itemize} -\item \texttt{int socket(int domain, int type, int protocol)} +\begin{prototype}{int socket(int domain, int type, int protocol)} La funzione restituisce un intero positivo se riesce, e -1 se fallisce, in quest'ultimo caso la variabile \texttt{errno} è settata con i seguenti codici di errore: - \begin{itemize} + \begin{errlist} \item \texttt{EPROTONOSUPPORT} Il tipo di socket o il protocollo scelto non sono supportati nel dominio. \item \texttt{ENFILE} Il kernel non ha memoria sufficiente a creare una @@ -100,8 +99,8 @@ socket, per cui viene messo a zero (con l'eccezione dei \textit{raw socket}). \item \texttt{EINVAL} Protocollo sconosciuto o dominio non disponibile. \item \texttt{ENOBUFS} o \texttt{ENOMEM} Non c'è sufficiente memoria per creare il socket. - \end{itemize} -\end{itemize} + \end{errlist} +\end{prototype} Si noti che la creazione del socket non comporta nulla riguardo all'indicazione degli indirizzi remoti o locali attraverso i quali si vuole @@ -539,28 +538,23 @@ Per questo motivo si usano le seguenti funzioni di conversione (i cui prototipi sono definiti in \texttt{netinet/in.h}) che servono a tener conto automaticamente della possibile differenza fra l'ordinamento usato sul computer e quello che viene usato nelle trasmissione sulla rete; queste -funzioni sono: -\begin{itemize} -\item \texttt{unsigned long int htonl(unsigned long int hostlong)} - +funzioni sono:{ +\begin{prototype}{unsigned long int htonl(unsigned long int hostlong)} Converte l'intero a 32 bit \texttt{hostlong} dal formato della macchina a quello della rete. - -\item \texttt{unsigned sort int htons(unsigned short int hostshort)} - +\end{prototype} +\begin{prototype}{unsigned sort int htons(unsigned short int hostshort)} Converte l'intero a 16 bit \texttt{hostshort} dal formato della macchina a quello della rete. - -\item \texttt{unsigned long int ntonl(unsigned long int netlong)} - +\end{prototype} +\begin{prototype}{unsigned long int ntonl(unsigned long int netlong)} Converte l'intero a 32 bit \texttt{netlong} dal formato della rete a quello della macchina. - -\item \texttt{unsigned sort int ntons(unsigned short int netshort)} - +\end{prototype} +\begin{prototype}{unsigned sort int ntons(unsigned short int netshort)} Converte l'intero a 16 bit \texttt{netshort} dal formato della rete a quello della macchina. -\end{itemize} +\end{prototype} I nomi sono assegnati usando la lettera $n$ come mnemonico per indicare l'ordinamento usato sulla rete (da \textit{network order}) e la lettera $h$ come mnemonico per l'ordinamento usato sulla macchina locale (da \textit{host @@ -588,32 +582,28 @@ cosiddetta notazione \textit{dotted-decimal}, (cio \texttt{192.160.0.1}) al formato binario (direttamente in \textit{network order}) e viceversa; in questo caso si usa la lettera $a$ come mnemonico per indicare la stringa. Dette funzioni sono: -\begin{itemize} -\item \texttt{int inet\_aton(const char *src, struct in\_addr *dest)} - +\begin{prototype}{int inet\_aton(const char *src, struct in\_addr *dest)} Converte la stringa puntata da \texttt{src} nell'indirizzo binario da memorizzare all'indirizzo puntato da \texttt{dest}, restituendo 0 in caso di successo e 1 in caso di fallimento (è espressa in questa forma in modo da poterla usare direttamente con il puntatore usato per passare la struttura degli indirizzi). Se usata con \texttt{dest} inizializzato a \texttt{NULL} effettua la validazione dell'indirizzo. - -\item \texttt{in\_addr\_t inet\_addr(const char *strptr)} - +\end{prototype} +\begin{prototype}{in\_addr\_t inet\_addr(const char *strptr)} Restituisce l'indirizzo a 32 bit in network order a partire dalla stringa passata come parametro, in caso di errore restituisce il valore \texttt{INADDR\_NONE} che tipicamente sono trentadue bit a uno; questo comporta che la stringa \texttt{255.255.255.255}, che pure è un indirizzo valido, non può essere usata con questa funzione; per questo motivo essa è generalmente deprecata in favore della precedente. - -\item \texttt{char *inet\_ntoa(struct in\_addr addrptr)} - +\end{prototype} +\begin{prototype}{char *inet\_ntoa(struct in\_addr addrptr)} Converte il valore a 32 bit dell'indirizzo (espresso in network order) restituendo il puntatore alla stringa che contiene l'espressione in formato dotted decimal. Si deve tenere presente che la stringa risiede in memoria statica, per cui questa funzione non è rientrante. -\end{itemize} +\end{prototype} \subsection{Le funzioni \texttt{inet\_pton} e \texttt{inet\_ntop}} @@ -640,16 +630,13 @@ di indirizzo e pu famiglia indicata non è valida entrambe le funzioni ritornano un valore negativo e settano la variabile \texttt{errno} al valore \texttt{EAFNOSUPPORT}. I prototipi delle suddette funzioni sono i seguenti: -\begin{itemize} -\item \texttt{int inet\_pton(int family, const char *src, void *dest)} - +\begin{prototype}{int inet\_pton(int family, const char *src, void *dest)} Converte la stringa puntata da \texttt{src} nell'indirizzo binario da memorizzare all'indirizzo puntato da \texttt{dest}, restituendo 0 in caso di successo e 1 in caso di fallimento. - -\item \texttt{char *inet\_ntop(int family, const void *src, char *dest, +\end{prototype} +\begin{prototype}{char *inet\_ntop(int family, const void *src, char *dest, size\_t len)} - Converte la struttura dell'indirizzo puntata da \texttt{src} in una stringa che viene copiata nel buffer puntato dall'indirizzo \texttt{dest}; questo deve essere preallocato dall'utente e la lunghezza deve essere almeno @@ -662,8 +649,7 @@ negativo e settano la variabile \texttt{errno} al valore viene settata la variabile \texttt{errno} con il valore \texttt{ENOSPC} in caso le dimensioni dell'indirizzo eccedano la lunghezza specificata da \texttt{len}. - -\end{itemize} +\end{prototype} \section{Il comportamento delle funzioni di I/O} -- 2.30.2