Completato il capitolo sui socket elementari, con tanto di spiegazioni delle
[gapil.git] / socket.tex
index 4d19955bb8e73676d7ad7d6ddb3db02106145f04..b379719cf38d3c63289c30fc4694cdf9ed28e649 100644 (file)
@@ -6,8 +6,8 @@ principali meccanismi di comunicazione fra programmi utilizzato in ambito unix
 (e non solo). Il socket costituisce in sostanza un canale di comunicazione fra
 due processi su cui si possono leggere e scrivere dati analogo a quello di una
 pipe ma a differenza di questa e degli altri meccanismi esaminati nel capitolo
-\ref{cha:IPC} i socket non sono limitati alla comunicazione fra processi che
-girano sulla stessa macchina ma possono effettuare la comunicazione anche
+\capref{cha:IPC} i socket non sono limitati alla comunicazione fra processi
+che girano sulla stessa macchina ma possono effettuare la comunicazione anche
 attraverso la rete.
 
 Quella dei socket costituisce infatti la principale API (\textit{Application
@@ -29,8 +29,8 @@ tratteremo in maniera pi
 \label{sec:sock_gen}
 
 Per capire il funzionamento dei socket occorre avere presente il funzionamento
-dei protocolli di rete (vedi \ref{cha:network}), ma l'interfaccia è del tutto
-generale e benché le problematiche (e quindi le modalità di risolvere i
+dei protocolli di rete (vedi \capref{cha:network}), ma l'interfaccia è del
+tutto generale e benché le problematiche (e quindi le modalità di risolvere i
 problemi) siano diverse a seconda del tipo di protocollo di comunicazione
 usato, le funzioni da usare restano le stesse.
 
@@ -75,21 +75,19 @@ dei file che contiene i puntatori alle opportune strutture usate dal kernel ed
 allocate per ogni processo, (la stessa usata per i files e le pipes [NdA
 verificare!]).
 
-Il prototipo della funzione è definito nell'header \texttt{sys/socket.h}, la
-funzione prende tre parametri, il dominio del socket (che definisce la
-famiglia di protocolli, vedi \ref{sec:sock_domain}), il tipo di socket (che
-definisce lo stile di comunicazione vedi \ref{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}).
+La funzione prende tre parametri, il dominio del socket (che definisce la
+famiglia di protocolli, vedi \secref{sec:sock_domain}), il tipo di socket (che
+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}{sys/socket.h}{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 +98,8 @@ 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
@@ -371,11 +369,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}
-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.
+specifica il numero di porta (vedi \secref{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
@@ -386,7 +384,7 @@ Infine 
 essere specificati in quello che viene chiamato \textit{network order}, cioè
 con i bit ordinati in formato \textit{big endian}, questo comporta la
 necessità di usare apposite funzioni di conversione per mantenere la
-portabilità del codice (vedi \ref{sec:sock_addr_func} per i dettagli del
+portabilità del codice (vedi \secref{sec:sock_addr_func} per i dettagli del
 problema e le relative soluzioni).
 
 \subsection{La struttura degli indirizzi IPv6}
@@ -423,7 +421,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
-(vedi \ref{sec:appA_ipv6}) ed il loro uso è sperimentale.
+(vedi \secref{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
@@ -535,32 +533,30 @@ esempio nel caso dell'intero a 16 bit ci si ritrover
 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
-computer e quello che viene usato nelle trasmissione sulla rete; queste
+Per questo motivo si usano le seguenti funzioni di conversione 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)} 
-  
+\begin{prototype}{netinet/in.h}
+{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}{netinet/in.h}
+{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}{netinet/in.h}
+{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}{netinet/in.h}
+{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
@@ -577,10 +573,9 @@ codice su tutte le architetture.
   \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
-normalente.
+Un secondo insieme di funzioni di manipolazione serve per passare dal formato
+binario usato nelle strutture degli indirizzi alla rappresentazione dei numeri
+IP che si usa normalente.
 
 Le prime tre funzioni di manipolazione riguardano la conversione degli
 indirizzi IPv4 da una stringa in cui il numero di IP è espresso secondo la
@@ -588,32 +583,29 @@ 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)}
-  
-  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)}
-  
+\begin{prototype}{arpa/inet.h}
+  {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.
+\end{prototype}
+\begin{prototype}{arpa/inet.h}{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}{arpa/inet.h}{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 +632,15 @@ 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}{sys/socket.h}
+{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,
-    size\_t len)}
-  
+\end{prototype}
+
+\begin{prototype}{sys/socket.h}
+{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 +653,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}