Ancora revisione degli indici, aggiunto CLONE_VM e paragrafo su
[gapil.git] / socket.tex
index 92ffe95a932f9c7a9bd346a2af75aa291e084d8a..7e79d39439dc2ce7ed6f15f002b05ab72484e2cb 100644 (file)
@@ -9,7 +9,7 @@
 %% License".
 %%
 
 %% License".
 %%
 
-\chapter{Introduzione ai socket}
+\chapter{I socket}
 \label{cha:socket_intro}
 
 In questo capitolo inizieremo a spiegare le caratteristiche salienti della
 \label{cha:socket_intro}
 
 In questo capitolo inizieremo a spiegare le caratteristiche salienti della
@@ -22,16 +22,18 @@ come creare un socket e come collegarlo allo specifico protocollo di rete che
 si utilizzerà per la comunicazione. Per evitare un'introduzione puramente
 teorica concluderemo il capitolo con un primo esempio di applicazione.
 
 si utilizzerà per la comunicazione. Per evitare un'introduzione puramente
 teorica concluderemo il capitolo con un primo esempio di applicazione.
 
-\section{Una panoramica}
+\section{Introduzione ai socket}
 \label{sec:sock_overview}
 
 \label{sec:sock_overview}
 
-Iniziamo con una descrizione essenziale di cosa sono i \textit{socket} e di
-quali sono i concetti fondamentali da tenere presente quando si ha a che fare
-con essi.
+In questa sezione daremo descrizione essenziale di cosa sono i \textit{socket}
+e di quali sono i concetti fondamentali da tenere presente quando si ha a che
+fare con essi; ne illustreremo poi le caratteristiche e le differenti
+tipologie presenti ed infine tratteremo le modalità con cui possono essere
+creati.
 
 \index{socket!definizione|(}
 
 
 \index{socket!definizione|(}
 
-\subsection{I \textit{socket}}
+\subsection{Cosa sono \textit{socket}}
 \label{sec:sock_socket_def}
 
 I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
 \label{sec:sock_socket_def}
 
 I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
@@ -62,24 +64,20 @@ utilizzare i socket con i più disparati meccanismi di comunicazione, e non
 solo con l'insieme dei protocolli TCP/IP, anche se questa sarà comunque quella
 di cui tratteremo in maniera più estesa.
 
 solo con l'insieme dei protocolli TCP/IP, anche se questa sarà comunque quella
 di cui tratteremo in maniera più estesa.
 
-
-\subsection{Concetti base}
-\label{sec:sock_gen}
-
 Per capire il funzionamento dei socket occorre avere presente il funzionamento
 Per capire il funzionamento dei socket occorre avere presente il funzionamento
-dei protocolli di rete che su utilizzeranno (vedi cap.~\ref{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 nella gestione dei
-socket restano le stesse.
+dei protocolli di rete che su utilizzeranno (ed in particolare quelli del
+TCP/IP già illustrati in sez.~\ref{sec:net_tpcip}), 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 nella gestione dei socket restano le stesse.
 
 Per questo motivo una semplice descrizione dell'interfaccia è assolutamente
 inutile, in quanto il comportamento di quest'ultima e le problematiche da
 affrontare cambiano radicalmente a seconda del tipo di comunicazione usato.
 
 Per questo motivo una semplice descrizione dell'interfaccia è assolutamente
 inutile, in quanto il comportamento di quest'ultima e le problematiche da
 affrontare cambiano radicalmente a seconda del tipo di comunicazione usato.
-La scelta di questo tipo (sovente anche detto \textsl{stile}) va infatti ad
-incidere sulla semantica che verrà utilizzata a livello utente per gestire la
-comunicazione cioè su come inviare e ricevere i dati e sul comportamento
-effettivo delle funzioni utilizzate.
+La scelta di questo tipo di comunicazione (sovente anche detto \textsl{stile})
+va infatti ad incidere sulla semantica che verrà utilizzata a livello utente
+per gestire la comunicazione cioè su come inviare e ricevere i dati e sul
+comportamento effettivo delle funzioni utilizzate.
 
 La scelta di uno \textsl{stile} dipende sia dai meccanismi disponibili, sia
 dal tipo di comunicazione che si vuole effettuare. Ad esempio alcuni tipi di
 
 La scelta di uno \textsl{stile} dipende sia dai meccanismi disponibili, sia
 dal tipo di comunicazione che si vuole effettuare. Ad esempio alcuni tipi di
@@ -100,18 +98,21 @@ cui essa avviene nei confronti dei corrispondenti, in certi casi essa può
 essere condotta con una connessione diretta con un solo corrispondente, come
 per una telefonata; altri casi possono prevedere una comunicazione come per
 lettera, in cui si scrive l'indirizzo su ogni pacchetto, altri ancora una
 essere condotta con una connessione diretta con un solo corrispondente, come
 per una telefonata; altri casi possono prevedere una comunicazione come per
 lettera, in cui si scrive l'indirizzo su ogni pacchetto, altri ancora una
-comunicazione \itindex{broadcast} \textit{broadcast} come per la radio, in cui
-i pacchetti vengono emessi su appositi ``\textsl{canali}'' dove chiunque si
-collega possa riceverli.
+comunicazione uno a molti come il \textit{broadcast} ed il \textit{multicast},
+in cui i pacchetti possono venire emessi su appositi ``\textsl{canali}'' dove
+chiunque si collega possa riceverli.
 
 
-É chiaro che ciascuno di questi diversi aspetti associato ad un tipo di
-comunicazione comporta una modalità diversa di gestire la stessa, ad esempio
-se è inaffidabile occorrerà essere in grado di gestire la perdita o il
-rimescolamento dei dati, se è a pacchetti questi dovranno essere
-opportunamente trattati, ecc.
+É chiaro che ciascuno di questi diversi aspetti è associato ad un tipo di
+comunicazione che comporta una modalità diversa di gestire la stessa, ad
+esempio se la comunicazione è inaffidabile occorrerà essere in grado di
+gestire la perdita o il rimescolamento dei dati, se è a pacchetti questi
+dovranno essere opportunamente trattati, se è uno a molti occorrerà tener
+conto della eventuale unidirezionalità della stessa, ecc.
+
+\index{socket!definizione|)}
 
 
 
 
-\section{La creazione di un socket}
+\subsection{La creazione di un socket}
 \label{sec:sock_creation}
 
 Come accennato l'interfaccia dei socket è estremamente flessibile e permette
 \label{sec:sock_creation}
 
 Come accennato l'interfaccia dei socket è estremamente flessibile e permette
@@ -119,9 +120,6 @@ di interagire con protocolli di comunicazione anche molto diversi fra di loro;
 in questa sezione vedremo come è possibile creare un socket e come specificare
 il tipo di comunicazione che esso deve utilizzare.
 
 in questa sezione vedremo come è possibile creare un socket e come specificare
 il tipo di comunicazione che esso deve utilizzare.
 
-\subsection{La funzione \func{socket}}
-\label{sec:sock_socket}
-
 La creazione di un socket avviene attraverso l'uso della funzione di sistema 
 \funcd{socket}; essa restituisce un \textit{file descriptor} (del tutto
 analogo a quelli che si ottengono per i file di dati e le \textit{pipe},
 La creazione di un socket avviene attraverso l'uso della funzione di sistema 
 \funcd{socket}; essa restituisce un \textit{file descriptor} (del tutto
 analogo a quelli che si ottengono per i file di dati e le \textit{pipe},
@@ -524,7 +522,7 @@ tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
 essere specificati in quello che viene chiamato \textit{network order}, cioè
 con i bit ordinati in formato \textit{big endian} (vedi
 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
 essere specificati in quello che viene chiamato \textit{network order}, cioè
 con i bit ordinati in formato \textit{big endian} (vedi
-sez.~\ref{sec:sock_endianness}), questo comporta la necessità di usare apposite
+sez.~\ref{sec:endianness}), questo comporta la necessità di usare apposite
 funzioni di conversione per mantenere la portabilità del codice (vedi
 sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
 soluzioni).
 funzioni di conversione per mantenere la portabilità del codice (vedi
 sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
 soluzioni).
@@ -560,7 +558,7 @@ il loro uso è sperimentale.
 Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
 espresso da un vettore di 16 byte. Infine il campo \var{sin6\_scope\_id} è un
 campo introdotto in Linux con il kernel 2.4, per gestire alcune operazioni
 Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
 espresso da un vettore di 16 byte. Infine il campo \var{sin6\_scope\_id} è un
 campo introdotto in Linux con il kernel 2.4, per gestire alcune operazioni
-riguardanti il \itindex{multicast} \textit{multicasting}.  Si noti infine che
+riguardanti il \textit{multicasting}.  Si noti infine che
 \struct{sockaddr\_in6} ha una dimensione maggiore della struttura
 \struct{sockaddr} generica di fig.~\ref{fig:sock_sa_gen_struct}, quindi
 occorre stare attenti a non avere fatto assunzioni riguardo alla possibilità
 \struct{sockaddr\_in6} ha una dimensione maggiore della struttura
 \struct{sockaddr} generica di fig.~\ref{fig:sock_sa_gen_struct}, quindi
 occorre stare attenti a non avere fatto assunzioni riguardo alla possibilità
@@ -640,7 +638,7 @@ inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere
 usati solo da processi con i privilegi di amministratore o con la
 \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}.  L'indirizzo remoto è
 specificato nella struttura \var{sat\_addr}, e deve essere in \textit{network
 usati solo da processi con i privilegi di amministratore o con la
 \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}.  L'indirizzo remoto è
 specificato nella struttura \var{sat\_addr}, e deve essere in \textit{network
-  order} (vedi sez.~\ref{sec:sock_endianness}); esso è composto da un parte di
+  order} (vedi sez.~\ref{sec:endianness}); esso è composto da un parte di
 rete data dal campo \var{s\_net}, che può assumere il valore
 \const{AT\_ANYNET}, che indica una rete generica e vale anche per indicare la
 rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e può prendere
 rete data dal campo \var{s\_net}, che può assumere il valore
 \const{AT\_ANYNET}, che indica una rete generica e vale anche per indicare la
 rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e può prendere
@@ -744,12 +742,11 @@ pacchetto; entrambi vengono impostati alla ricezione di un pacchetto ed han
 senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i
 seguenti valori: \const{PACKET\_HOST} per un pacchetto indirizzato alla
 macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di
 senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i
 seguenti valori: \const{PACKET\_HOST} per un pacchetto indirizzato alla
 macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di
-\itindex{broadcast} \textit{broadcast}, \const{PACKET\_MULTICAST} per un
-pacchetto inviato ad un indirizzo fisico di \itindex{multicast}
-\textit{multicast}, \const{PACKET\_OTHERHOST} per un pacchetto inviato ad
-un'altra stazione (e ricevuto su un'interfaccia in \index{modo~promiscuo} modo
-promiscuo), \const{PACKET\_OUTGOING} per un pacchetto originato dalla propria
-macchina che torna indietro sul socket.
+\textit{broadcast}, \const{PACKET\_MULTICAST} per un pacchetto inviato ad un
+indirizzo fisico di \textit{multicast}, \const{PACKET\_OTHERHOST} per un
+pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in
+\index{modo~promiscuo} modo promiscuo), \const{PACKET\_OUTGOING} per un
+pacchetto originato dalla propria macchina che torna indietro sul socket.
 
 
 Si tenga presente infine che in fase di ricezione, anche se si richiede il
 
 
 Si tenga presente infine che in fase di ricezione, anche se si richiede il
@@ -786,15 +783,15 @@ può comportare la necessità di eseguire delle conversioni.
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
-Come già visto in sez.~\ref{sec:sock_endianness} il problema connesso
-\itindex{endianness} all'\textit{endianness} è che quando si passano dei dati da
-un tipo 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
-byte in cui è suddiviso scambiati di posto.  Per questo motivo si usano delle
-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 \funcd{htonl},
-\funcd{htons}, \funcd{ntohl} e \funcd{ntohs} ed i rispettivi prototipi sono:
+Come già visto in sez.~\ref{sec:endianness} il problema connesso
+all'\textit{endianness} è che quando si passano dei dati da un tipo 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 byte in cui è
+suddiviso scambiati di posto.  Per questo motivo si usano delle 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 \funcd{htonl}, \funcd{htons},
+\funcd{ntohl} e \funcd{ntohs} ed i rispettivi prototipi sono:
 \begin{functions}
   \headdecl{netinet/in.h}
   \funcdecl{unsigned long int htonl(unsigned long int hostlong)} 
 \begin{functions}
   \headdecl{netinet/in.h}
   \funcdecl{unsigned long int htonl(unsigned long int hostlong)} 
@@ -884,7 +881,7 @@ L'ultima funzione, \func{inet\_ntoa}, converte il valore a 32 bit
 dell'indirizzo (espresso in \textit{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
 dell'indirizzo (espresso in \textit{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 è \index{funzioni!rientranti} rientrante.
+funzione non è rientrante.
 
 
 \subsection{Le funzioni \func{inet\_pton} e \func{inet\_ntop}}
 
 
 \subsection{Le funzioni \func{inet\_pton} e \func{inet\_ntop}}
@@ -953,8 +950,6 @@ Il formato usato per gli indirizzi in formato di presentazione è la notazione
 \textit{dotted decimal} per IPv4 e quello descritto in
 sez.~\ref{sec:IP_ipv6_notation} per IPv6.
 
 \textit{dotted decimal} per IPv4 e quello descritto in
 sez.~\ref{sec:IP_ipv6_notation} per IPv6.
 
-\index{socket!definizione|)}
-