Tolto un po` di inglese e armonizzate alcune cose (con relativa creazione
[gapil.git] / socket.tex
index fafe08ebd1610b00eb7e5120b7aea0ad2fbf2d03..4d19955bb8e73676d7ad7d6ddb3db02106145f04 100644 (file)
@@ -112,13 +112,13 @@ effettuare la comunicazione.
 
 Dati i tanti e diversi protocolli di comunicazione disponibili, esistono vari
 tipi di socket, che vengono classificati raggruppandoli in quelli che si
 
 Dati i tanti e diversi protocolli di comunicazione disponibili, esistono vari
 tipi di socket, che vengono classificati raggruppandoli in quelli che si
-chiamano \textsl{domini} (\textit{domains}).  La scelta di un dominio equivale
-in sostanza alla scelta di una famiglia di protocolli. Ciascun dominio ha un
-suo nome simbolico che convenzionalmente inizia con \texttt{PF\_} (da
-\textit{Protocol Family}, altro nome con cui si indicano i domini). 
+chiamano \textsl{domini}.  La scelta di un dominio equivale in sostanza alla
+scelta di una famiglia di protocolli. Ciascun dominio ha un suo nome simbolico
+che convenzionalmente inizia con \texttt{PF\_} da \textit{protocol family},
+altro nome con cui si indicano i domini.
 
 A ciascun tipo di dominio corrisponde un analogo nome simbolico che inizia per
 
 A ciascun tipo di dominio corrisponde un analogo nome simbolico che inizia per
-\texttt{AF\_} da \textit{Address Family}, e che identifica il formato degli
+\texttt{AF\_} da \textit{address family}, e che identifica il formato degli
 indirizzi usati in quel dominio; le man pages di linux si riferiscono a questi
 anche come \textit{name space}, (nome che però il manuale della glibc riserva
 ai domini) e che identifica il formato degli indirizzi usati in quel dominio.
 indirizzi usati in quel dominio; le man pages di linux si riferiscono a questi
 anche come \textit{name space}, (nome che però il manuale della glibc riserva
 ai domini) e che identifica il formato degli indirizzi usati in quel dominio.
@@ -140,6 +140,7 @@ protocolli disponibili sono riportate in \ntab.
   \centering
   \begin{tabular}[c]{lll}
        Nome               & Utilizzo                       & Man page   \\
   \centering
   \begin{tabular}[c]{lll}
        Nome               & Utilizzo                       & Man page   \\
+       \hline
        PF\_UNIX,PF\_LOCAL & Local communication            & unix(7)    \\
        PF\_INET           & IPv4 Internet protocols        & ip(7)      \\
        PF\_INET6          & IPv6 Internet protocols        &            \\
        PF\_UNIX,PF\_LOCAL & Local communication            & unix(7)    \\
        PF\_INET           & IPv4 Internet protocols        & ip(7)      \\
        PF\_INET6          & IPv6 Internet protocols        &            \\
@@ -175,11 +176,10 @@ glibc chiama \textit{styles}) definiti come \texttt{int} in \texttt{socket.h}:
 \item \texttt{SOCK\_STREAM} Provvede un canale di trasmissione dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
 \item \texttt{SOCK\_STREAM} Provvede un canale di trasmissione dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
-  byte (da cui il nome \textit{stream}). Vedi \ref{sec:sock_stream}.
+  byte (da cui il nome \textit{stream}). 
 \item \texttt{SOCK\_DGRAM} Viene usato per mandare pacchetti di lunghezza
   massima fissata (\textit{datagram}) indirizzati singolarmente, senza
 \item \texttt{SOCK\_DGRAM} Viene usato per mandare pacchetti di lunghezza
   massima fissata (\textit{datagram}) indirizzati singolarmente, senza
-  connessione e in maniera non affidabile. È l'opposto del precedente. Vedi
-  \ref{sec:sock_dgram}.
+  connessione e in maniera non affidabile. È l'opposto del precedente. 
 \item \texttt{SOCK\_SEQPACKET} Provvede un canale di trasmissione di dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati possono solo essere trasmessi e letti per pacchetti (di
 \item \texttt{SOCK\_SEQPACKET} Provvede un canale di trasmissione di dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati possono solo essere trasmessi e letti per pacchetti (di
@@ -277,7 +277,7 @@ struct sockaddr {
 };
   \end{lstlisting}
   \caption{La struttura generica degli indirizzi dei socket \texttt{sockaddr}}
 };
   \end{lstlisting}
   \caption{La struttura generica degli indirizzi dei socket \texttt{sockaddr}}
-  \label{fig:sock_sa_struct}
+  \label{fig:sock_sa_gen_struct}
 \end{figure}
 
 Tutte le funzioni dei socket che usano gli indirizzi sono definite usando nel
 \end{figure}
 
 Tutte le funzioni dei socket che usano gli indirizzi sono definite usando nel
@@ -320,12 +320,11 @@ definiti; la struttura 
   \label{tab:sock_data_types}
 \end{table}
 
   \label{tab:sock_data_types}
 \end{table}
 
-In alcuni sistemi (per BSD a partire da 4.3BSD-reno) la struttura è
-leggermente diversa e prevede un primo membro aggiuntivo \texttt{uint8\_t
-  sin\_len} (come riportato da R. Stevens nei suoi libri). Questo campo non
-verrebbe usato direttamente dal programmatore e non è richiesto dallo standard
-Posix.1g, in Linux pertanto non sussiste. Il campo \texttt{sa\_family\_t} era
-storicamente un \texttt{unsigned short}.
+In alcuni sistemi la struttura è leggermente diversa e prevede un primo membro
+aggiuntivo \texttt{uint8\_t sin\_len} (come riportato da R. Stevens nei suoi
+libri). Questo campo non verrebbe usato direttamente dal programmatore e non è
+richiesto dallo standard Posix.1g, in linux pertanto non sussiste. Il campo
+\texttt{sa\_family\_t} era storicamente un \texttt{unsigned short}.
 
 Dal punto di vista del programmatore l'unico uso di questa struttura è quello
 di fare da riferimento per il casting, per il kernel le cose sono un po'
 
 Dal punto di vista del programmatore l'unico uso di questa struttura è quello
 di fare da riferimento per il casting, per il kernel le cose sono un po'
@@ -361,7 +360,7 @@ struct in_addr {
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket internet (IPv4)
     \texttt{sockaddr\_in}.}
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket internet (IPv4)
     \texttt{sockaddr\_in}.}
-  \label{fig:sock_sa_struct}
+  \label{fig:sock_sa_ipv4_struct}
 \end{figure}
 
 L'indirizzo di un socket internet (secondo IPv4) comprende l'indirizzo
 \end{figure}
 
 L'indirizzo di un socket internet (secondo IPv4) comprende l'indirizzo
@@ -372,11 +371,11 @@ RAW che accedono direttamente al livello di IP, nel qual caso il numero della
 porta viene settato al numero di protocollo.
 
 Il membro \texttt{sin\_family} deve essere sempre settato; \texttt{sin\_port}
 porta viene settato al numero di protocollo.
 
 Il membro \texttt{sin\_family} deve essere sempre settato; \texttt{sin\_port}
-specifica il numero di porta; i numeri di porta sotto il 1024 sono chiamati
-\textsl{riservati} in quanto utilizzati da servizi standard. Soltanto processi
-con i privilegi di root (effective uid uguale a zero) o con la capability
-\texttt{CAP\_NET\_BIND\_SERVICE} possono usare la funzione \texttt{bind} su
-queste porte.
+specifica il numero di porta (vedi \ref{sec:TCPel_port_num}; i numeri di porta
+sotto il 1024 sono chiamati \textsl{riservati} in quanto utilizzati da servizi
+standard. Soltanto processi con i privilegi di root (effective uid uguale a
+zero) o con la capability \texttt{CAP\_NET\_BIND\_SERVICE} possono usare la
+funzione \texttt{bind} su queste porte.
 
 Il membro \texttt{sin\_addr} contiene l'indirizzo internet dell'altro capo
 della comunicazione, e viene acceduto sia come struttura (un resto di una
 
 Il membro \texttt{sin\_addr} contiene l'indirizzo internet dell'altro capo
 della comunicazione, e viene acceduto sia come struttura (un resto di una
@@ -415,7 +414,7 @@ struct in6_addr {
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket IPv6 
     \texttt{sockaddr\_in6}.}
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket IPv6 
     \texttt{sockaddr\_in6}.}
-  \label{fig:sock_sa_struct}
+  \label{fig:sock_sa_ipv6_struct}
 \end{figure}
 
 Il campo \texttt{sin6\_family} deve essere sempre settato ad
 \end{figure}
 
 Il campo \texttt{sin6\_family} deve essere sempre settato ad
@@ -424,7 +423,7 @@ segue le stesse regole; il campo \texttt{sin6\_flowinfo} 
 in tre parti di cui i 24 bit inferiori indicano l'etichetta di flusso, i
 successivi 4 bit la priorità e gli ultimi 4 sono riservati; questi valori
 fanno riferimento ad alcuni campi specifici dell'header dei pacchetti IPv6
 in tre parti di cui i 24 bit inferiori indicano l'etichetta di flusso, i
 successivi 4 bit la priorità e gli ultimi 4 sono riservati; questi valori
 fanno riferimento ad alcuni campi specifici dell'header dei pacchetti IPv6
-(vedi \ref{sec:appA_ipv6}) ed il loro uso è sperimentale. 
+(vedi \ref{sec:appA_ipv6}) ed il loro uso è sperimentale.
 
 Il campo \texttt{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
 infine il campo \texttt{sin6\_scope\_id} è un campo introdotto con il kernel
 
 Il campo \texttt{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
 infine il campo \texttt{sin6\_scope\_id} è un campo introdotto con il kernel
@@ -434,16 +433,16 @@ Si noti che questa struttura 
 quindi occorre stare attenti a non avere fatto assunzioni riguardo alla
 possibilità di contenere i dati nelle dimensioni di quest'ultima.
 
 quindi occorre stare attenti a non avere fatto assunzioni riguardo alla
 possibilità di contenere i dati nelle dimensioni di quest'ultima.
 
+
 \subsection{La struttura degli indirizzi locali}
 \label{sec:sock_sa_local}
 
 I socket di tipo \texttt{PF\_UNIX} vengono usati per una comunicazione
 efficiente fra processi che stanno sulla stessa macchina; essi rispetto ai
 precedenti possono essere anche creati in maniera anonima attraverso la
 \subsection{La struttura degli indirizzi locali}
 \label{sec:sock_sa_local}
 
 I socket di tipo \texttt{PF\_UNIX} vengono usati per una comunicazione
 efficiente fra processi che stanno sulla stessa macchina; essi rispetto ai
 precedenti possono essere anche creati in maniera anonima attraverso la
-funzione \texttt{socketpair}. Quando però si vuole fare riferiemento ad uno di
-questi socket si deve usare la seguente struttura di indirizzi definita nel
-file di header \texttt{sys/un.h}.
+funzione \texttt{socketpair}. Quando però si vuole fare riferimento esplicito
+ad uno di questi socket si deve usare la seguente struttura di indirizzi
+definita nel file di header \texttt{sys/un.h}.
 
 \begin{figure}[!htbp]
   \footnotesize
 
 \begin{figure}[!htbp]
   \footnotesize
@@ -456,7 +455,7 @@ struct sockaddr_un {
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket locali 
     \texttt{sockaddr\_un}.}
   \end{lstlisting}
   \caption{La struttura degli indirizzi dei socket locali 
     \texttt{sockaddr\_un}.}
-  \label{fig:sock_sa_struct}
+  \label{fig:sock_sa_local_struct}
 \end{figure}
 
 In questo caso il campo \texttt{sun\_family} deve essere \texttt{AF\_UNIX},
 \end{figure}
 
 In questo caso il campo \texttt{sun\_family} deve essere \texttt{AF\_UNIX},
@@ -464,18 +463,18 @@ mentre il campo \texttt{sun\_path} deve specificare un indirizzo; questo ha
 due forme un file (di tipo socket) nel filesystem o una stringa univoca
 (tenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
 specificato come una stringa (terminata da uno zero) corrispondente al
 due forme un file (di tipo socket) nel filesystem o una stringa univoca
 (tenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
 specificato come una stringa (terminata da uno zero) corrispondente al
-pathname del file; nel secondo qinvece \texttt{sun\_path} inizia con uno zero
-vegono usati i restanti bytes come stringa (senza terminazione).
+pathname del file; nel secondo invece \texttt{sun\_path} inizia con uno zero
+vengono usati i restanti bytes come stringa (senza terminazione).
 
 
 
 
-\subsection{Il passaggio delle strutture}
-\label{sec:sock_addr_pass}
+\subsection{Il passaggio delle strutture}
+\label{sec:sock_addr_pass}
 
 
-Come detto nelle funzioni della API dei socket le strutture degli indirizzi
-vengono sempre passate per riferimento usando un puntatore; anche la lunghezza
-della struttura è passata come argomento, ma in questo caso la modalità del
-passaggio dipende dalla direzione del medesimo, dal processo al kernel o
-viceversa.
+Come detto nelle funzioni della API dei socket le strutture degli indirizzi
+vengono sempre passate per riferimento usando un puntatore; anche la lunghezza
+della struttura è passata come argomento, ma in questo caso la modalità del
+passaggio dipende dalla direzione del medesimo, dal processo al kernel o
+viceversa.
 
 % In particolare le tre funzioni \texttt{bind}, \texttt{connect} e
 % \texttt{sendto} passano la struttura al kernel, in questo caso è passata
 
 % In particolare le tre funzioni \texttt{bind}, \texttt{connect} e
 % \texttt{sendto} passano la struttura al kernel, in questo caso è passata
@@ -489,23 +488,33 @@ viceversa.
 \section{Le funzioni di conversione degli indirizzi}
 \label{sec:sock_addr_func}
 
 \section{Le funzioni di conversione degli indirizzi}
 \label{sec:sock_addr_func}
 
-Come accennato gli indirizzi internet e i numeri di porta usati nella rete
-devono essere forniti in formato big endian. In genere la rappresentazione di
-un numbero binario in un computer può essere fatta in due modi, chiamati
-rispettivamente \textit{big endian} e \textit{little endian} a seconda di come
-i singoli bit vengono aggregati per formare le variabili intere (in diretta
-corrispondenza a come sono poi in realtà cablati sui bus interni del
-computer).
+In questa sezione tratteremo delle varie funzioni usate per manipolare gli
+indirizzi, limitandoci però agli indirizzi internet.
+
+Come accennato gli indirizzi e i numeri di porta usati nella rete devono
+essere forniti in formato opportuno (il \textit{network order}). Per capire
+cosa significa tutto ciò occorre introdurre un concetto generale che tornerà
+utile anche in seguito.
+
+
+\subsection{La \textit{endianess}}
+\label{sec:sock_endianess}
+
+La rappresentazione di un numbero binario in un computer può essere fatta in
+due modi, chiamati rispettivamente \textit{big endian} e \textit{little
+  endian} a seconda di come i singoli bit vengono aggregati per formare le
+variabili intere (in diretta corrispondenza a come sono poi in realtà cablati
+sui bus interni del computer).
 
 Per capire meglio il problema si consideri un intero a 16 bit scritto in una
 locazione di memoria posta ad un certo indirizzo. I singoli bit possono essere
 disposti un memoria in due modi, a partire dal più significativo o a partire
 dal meno significativo. Così nel primo caso si troverà il byte che contiene i
 bit più significativi all'indirizzo menzionato e il byte con i bit meno
 
 Per capire meglio il problema si consideri un intero a 16 bit scritto in una
 locazione di memoria posta ad un certo indirizzo. I singoli bit possono essere
 disposti un memoria in due modi, a partire dal più significativo o a partire
 dal meno significativo. Così nel primo caso si troverà il byte che contiene i
 bit più significativi all'indirizzo menzionato e il byte con i bit meno
-significativi nell'indirizzo successivo; questo ordinamento è detto little
-endian dato che il dato finale è la parte ``piccola'' del numero. Il caso
-opposto, in cui si parte dal bit meno significativo è detto per lo stesso
-motivo big endian.
+significativi nell'indirizzo successivo; questo ordinamento è detto
+\textit{little endian} dato che il dato finale è la parte ``piccola'' del
+numero. Il caso opposto, in cui si parte dal bit meno significativo è detto
+per lo stesso motivo \textit{big endian}.
 
 La \textit{endianess} di un computer dipende essenzialmente dalla architettura
 hardware usata; intel e digital usano il little endian, motorola, ibm, sun
 
 La \textit{endianess} di un computer dipende essenzialmente dalla architettura
 hardware usata; intel e digital usano il little endian, motorola, ibm, sun
@@ -517,16 +526,20 @@ in linux l'ordinamanento 
 cambiamenti sono possibili anche dopo che il sistema è avviato, non vengono
 mai eseguiti.
 
 cambiamenti sono possibili anche dopo che il sistema è avviato, non vengono
 mai eseguiti.
 
+\subsection{Le funzioni per il riordinamento}
+\label{sec:sock_func_ord}
+
 Il problema connesso all'endianess è che quando si passano dei dati da un tipo
 Il problema connesso all'endianess è che quando si passano dei dati da un tipo
-di architettura all'altra; in questo caso infatti nel passaggio i dati vengono
-interpretati in maniera diversa, e nel caso dell'esempio dell'intero a 16 bit
-ci si ritroverà con i due bytes componenti scambiati di posto, mentre in
-generale ne sarà invertito l'ordine di lettura e andranno perciò rovesciati.
+di architettura all'altra i dati vengono interpretati in maniera diversa, e ad
+esempio nel caso dell'intero a 16 bit ci si ritroverà con i due bytes in cui è
+suddiviso scambiati di posto, e ne sarà quindi invertito l'ordine di lettura
+per cui, per riavere il valore originale dovrenno essere rovesciati.
 
 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
 
 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:
+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)} 
   
 \begin{itemize}
 \item \texttt{unsigned long int htonl(unsigned long int hostlong)} 
   
@@ -560,6 +573,10 @@ fanno nulla); esse vanno sempre utilizzate per assicurare la portabilit
 codice su tutte le architetture.
 
 
 codice su tutte le architetture.
 
 
+\subsection{Le funzioni \texttt{inet\_aton}, \texttt{inet\_addr} e 
+  \texttt{inet\_ntoa}}
+\label{sec:sock_func_ipv4}
+
 Un secondo insieme di funzioni di manipolazione (i cui prototipi sono definiti
 in \texttt{arpa/inet.h}) serve per passare dal formato binario usato nelle
 strutture degli indirizzi alla rappresentazione dei numeri IP che si usa
 Un secondo insieme di funzioni di manipolazione (i cui prototipi sono definiti
 in \texttt{arpa/inet.h}) serve per passare dal formato binario usato nelle
 strutture degli indirizzi alla rappresentazione dei numeri IP che si usa
@@ -572,13 +589,13 @@ cosiddetta notazione \textit{dotted-decimal}, (cio
   order}) e viceversa; in questo caso si usa la lettera $a$ come mnemonico per
 indicare la stringa. Dette funzioni sono:
 \begin{itemize}
   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 *strptr, struct in\_addr *addrptr)}
+\item \texttt{int inet\_aton(const char *src, struct in\_addr *dest)}
   
   
-  Converte la stringa puntata da \texttt{strptr} nell'indirizzo binario da
-  memorizzare all'indirizzo puntato da \texttt{addrptr}, restituendo 0 in caso
+  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
   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{addrptr} inizializzato a
+  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)}
   \texttt{NULL} effettua la validazione dell'indirizzo.
   
 \item \texttt{in\_addr\_t inet\_addr(const char *strptr)}
@@ -590,7 +607,7 @@ indicare la stringa. Dette funzioni sono:
   valido, non può essere usata con questa funzione; per questo motivo essa è
   generalmente deprecata in favore della precedente.
   
   valido, non può essere usata con questa funzione; per questo motivo essa è
   generalmente deprecata in favore della precedente.
   
-\item \texttt{char *inet\_ntop(struct in\_addr addrptr)}
+\item \texttt{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
   
   Converte il valore a 32 bit dell'indirizzo (espresso in network order)
   restituendo il puntatore alla stringa che contiene l'espressione in formato
@@ -598,10 +615,14 @@ indicare la stringa. Dette funzioni sono:
   statica, per cui questa funzione non è rientrante.
 \end{itemize}
 
   statica, per cui questa funzione non è rientrante.
 \end{itemize}
 
-Le tre funzioni precedenti sono però limitate solo ad IPv4, per questo motivo
-è preferibile usare le due nuove funzioni \texttt{inet\_pton} e
+
+\subsection{Le funzioni \texttt{inet\_pton} e \texttt{inet\_ntop}}
+\label{sec:sock_conv_func_gen}
+
+Le tre funzioni precedenti sono limitate solo ad indirizzi IPv4, per questo
+motivo è preferibile usare le due nuove funzioni \texttt{inet\_pton} e
 \texttt{inet\_ntop} che possono convertire anche gli indirizzi IPv6 (secondo
 \texttt{inet\_ntop} che possono convertire anche gli indirizzi IPv6 (secondo
-lo schema in \nfig). Anche in questo caso le lettere $n$ e $p$ sono gli
+lo schema in \nfig). Anche in questo caso le lettere $n$ e $p$ sono degli
 mnemonici per ricordare il tipo di conversione effettuata e stanno per
 \textit{presentation} e \textit{numeric}.
 
 mnemonici per ricordare il tipo di conversione effettuata e stanno per
 \textit{presentation} e \textit{numeric}.
 
@@ -636,7 +657,7 @@ negativo e settano la variabile \texttt{errno} al valore
   \texttt{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
   comunque venire specificata attraverso il parametro \texttt{len}.
   
   \texttt{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
   comunque venire specificata attraverso il parametro \texttt{len}.
   
-  La funzione restitisce un puntatore non nullo a \texttt{dest} in caso di
+  La funzione restituisce un puntatore non nullo a \texttt{dest} in caso di
   successo e un puntatore nullo in caso di fallimento, in quest'ultimo caso
   viene settata la variabile \texttt{errno} con il valore \texttt{ENOSPC} in
   caso le dimensioni dell'indirizzo eccedano la lunghezza specificata da
   successo e un puntatore nullo in caso di fallimento, in quest'ultimo caso
   viene settata la variabile \texttt{errno} con il valore \texttt{ENOSPC} in
   caso le dimensioni dell'indirizzo eccedano la lunghezza specificata da
@@ -649,35 +670,97 @@ negativo e settano la variabile \texttt{errno} al valore
 \label{sec:sock_io_behav}
 
 Una cosa di cui non sempre si è consapevoli quando si ha a che fare con i
 \label{sec:sock_io_behav}
 
 Una cosa di cui non sempre si è consapevoli quando si ha a che fare con i
-socket è che le funzioni di I/O non sempre hanno lo stesso comportamento che
-avrebbero con i normali files (in particolare questo è vero nel caso si stream
-socket). Infatti con i socket funzioni come \texttt{read} o \texttt{write}
-possono restituire in input o scrivere in output un numero di bytes minore di
-quello richiesto, e questo è un comportamento normale e non un errore. Ciò
-avviene perché il kernel può 
-
-
-
-
+socket è che le funzioni di input/output non sempre hanno lo stesso
+comportamento che avrebbero con i normali files (in particolare questo accade
+per i socket di tipo stream). 
 
 
+Infatti con i socket può accadere che funzioni come \texttt{read} o
+\texttt{write} possano restituire in input o scrivere in output un numero di
+bytes minore di quello richiesto. Questo è un comportamento normale e non un
+errore, e succede perché si eccede in lettura o scrittura il limite di buffer
+del kernel. 
 
 
+In questo caso tutto quello che il programma chiamante deve fare è di ripetere
+la lettura (o scrittura) per la quantità di bytes rimanenti (lo stesso può
+avvenire scrivendo più di 4096 bytes in una pipe, dato che quello è il limite
+di solito adottato per il buffer di trasmissione del kernel).
 
 
-\chapter{Socket TCP elementari}
-\label{cha:elem_TCP_sock}
-
-Esamineremo in questo capitolo quanto necessario per capire come scrivere un
-client e un server TCP, riprendendo quanto visto in \ref{sec:net_cli_sample} e
-\ref{sec:net_cli_server}. 
+\begin{figure}[htb]
+  \centering
+  \footnotesize
+  \begin{lstlisting}{}
+#include <unistd.h>
 
 
+ssize_t SockRead(int fd, void *buf, size_t count) 
+{
+    size_t nleft;
+    ssize_t nread;
+    nleft = count;
+    while (nleft > 0) {             /* repeat until no left */
+        if ( (nread = read(fd, buf, nleft)) < 0) {
+            if (errno == EINTR) {   /* if interrupted by system call */
+                continue;           /* repeat the loop */
+            } else {
+                return(nread);      /* otherwise exit */
+            }
+        } else if (nread == 0) {    /* EOF */
+            break;                  /* break loop here */ 
+        }
+        nleft -= nread;             /* set left to read */
+        buf +=nread;                /* set pointer */
+    }
+    return (count - nleft);
+}  
+  \end{lstlisting}
+  \caption{Funzione \texttt{SockRead}, legge $n$ bytes da un socket }
+  \label{fig:sock_SockRead_code}
+\end{figure}
 
 
-\subsection{Creazione e terminazione della connessione TCP}
+Per questo motivo seguendo l'esempio di W. R. Stevens si sono definite due
+funzioni \texttt{SockRead} e \texttt{SockWrite} che eseguono la lettura da un
+socket tenendo conto di questa caratteristica, ed in grado di ritornare dopo
+avere letto o scritto esattamente il numero di bytes specificato; il sorgente
+è riportato in \curfig\ e \nfig\ ed è disponibile fra i sorgenti allegati alla
+guida nei files \texttt{SockRead.c} e \texttt{SockWrite.c}.
 
 
-Per capire il funzionamento delle funzioni della interfaccia dei socket che
-operano con TCP (le varie \texttt{connect}, \texttt{accept}, \texttt{close}
-che abbiamo visto negli esempi iniziali e su cui torneremo più avanti) è
-fodamentale capire come funziona la creazione e la conclusione di una
-connessione TCP.
+\begin{figure}[htb]
+  \centering
+  \footnotesize
+  \begin{lstlisting}{}
+#include <unistd.h>
+
+ssize_t SockWrite(int fd, const void *buf, size_t count) 
+{
+    size_t nleft;
+    ssize_t nwritten;
+
+    nleft = count;
+    while (nleft > 0) {             /* repeat until no left */
+        if ( (nwritten = write(fd, buf, nleft)) < 0) {
+            if (errno == EINTR) {   /* if interrupted by system call */
+                continue;           /* repeat the loop */
+            } else {
+                return(nwritten);   /* otherwise exit with error */
+            }
+        }
+        nleft -= nwritten;          /* set left to write */
+        buf +=nwritten;             /* set pointer */
+    }
+    return (count);
+}  
+  \end{lstlisting}
+  \caption{Funzione \texttt{SockWrite}, scrive $n$ bytes su un socket }
+  \label{fig:sock_SockWrite_code}
+\end{figure}
 
 
-\subsection{Le porte}
+Come si può notare le funzioni ripetono la lettura/scrittura in un loop fino
+all'esaurimento del numero di bytes richiesti, in caso di errore viene
+controllato se questo è \texttt{EINTR} (cioè un'interruzione della system call
+dovuta ad un segnale), nel qual caso l'accesso viene ripetuto, altrimenti
+l'errore viene ritornato interrompendo il loop. 
 
 
+Nel caso della lettura se il numero di bytes letti è zero significa che è
+arrivati alla fine del file e pertanto si ritorna senza aver concluso la
+lettura di tutti i bytes richiesti.