Altri indici, aggiornamenti date di copyright e dizionari locali.
[gapil.git] / sockctrl.tex
index 38722cdb269fe98e8cf069d5f9d5dba962cc546b..9c17ab6eb51957dc26d22084dfa11e04547c77bb 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2005 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2006 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -50,7 +50,7 @@ necessita di compiere questa operazione.
 \begin{figure}[htb]
   \centering
   \includegraphics[width=9cm]{img/resolver}
-  \caption{Schema di funzionamento delle routine del \textit{resolver}.}
+  \caption{Schema di funzionamento delle funzioni del \textit{resolver}.}
   \label{fig:sock_resolver_schema}
 \end{figure}
 
@@ -59,7 +59,7 @@ possibile fra nomi simbolici e valori numerici, come abbiamo visto anche in
 sez.~\ref{sec:sys_user_group} per le corrispondenze fra nomi di utenti e
 gruppi e relativi identificatori numerici; per quanto riguarda però tutti i
 nomi associati a identificativi o servizi relativi alla rete il servizio di
-risoluzione è gestito in maniera unificata da un insieme di routine fornite
+risoluzione è gestito in maniera unificata da un insieme di funzioni fornite
 con le librerie del C, detto appunto \textit{resolver}.
 
 Lo schema di funzionamento del \textit{resolver} è illustrato in
@@ -983,7 +983,7 @@ insieme a tutto lo spazio necessario a contenere i dati in essa referenziati;
 per questo motivo queste funzioni non soffrono dei problemi dovuti all'uso di
 una sezione statica di memoria presenti con le precedenti \func{gethostbyname}
 e \func{gethostbyaddr}.  L'uso di una allocazione dinamica però comporta anche
-la necessità di deallocare esplicitamente la memoria occupata dai risultati
+la necessità di disallocare esplicitamente la memoria occupata dai risultati
 una volta che questi non siano più necessari; a tale scopo viene fornita la
 funzione \funcd{freehostent}, il cui prototipo è:
 \begin{functions}
@@ -1511,7 +1511,7 @@ errore ed uscire.\footnote{questa eventualit
 Per ciascuno delle due possibili famiglie di indirizzi si estraggono le
 informazioni che poi verranno stampate alla fine del ciclo (\texttt{\small
   31--34}). Il primo caso esaminato (\texttt{\small 15--21}) è quello degli
-indirizzi IPv4, nel qual caso prima se ne stampa l'indentificazione
+indirizzi IPv4, nel qual caso prima se ne stampa l'identificazione
 (\texttt{\small 16}) poi si provvede a ricavare la struttura degli indirizzi
 (\texttt{\small 17}) indirizzata dal campo \var{ai\_addr}, eseguendo un
 opportuno casting del puntatore per poter estrarre da questa la porta
@@ -1586,10 +1586,10 @@ si copiano anche tutti i dati presenti agli indirizzi contenuti nella
 struttura \struct{addrinfo}, perché una volta disallocati i dati con
 \func{freeaddrinfo} questi non sarebbero più disponibili. 
 
-Anche la nuova intefaccia definita da POSIX prevede una nuova funzione per
+Anche la nuova interfaccia definita da POSIX prevede una nuova funzione per
 eseguire la risoluzione inversa e determinare nomi di servizi e di dominio
 dati i rispettivi valori numerici. La funzione che sostituisce le varie
-\func{gethostbyname}, \func{geipnodebyname} e \func{getservname} è
+\func{gethostbyname}, \func{getipnodebyname} e \func{getservname} è
 \funcd{getnameinfo}, ed il suo prototipo è:
 \begin{functions}
   \headdecl{sys/socket.h}
@@ -1673,7 +1673,7 @@ finora, quello in cui si specifica nel client un indirizzo remoto per la
 connessione al server, e quello in cui si specifica nel server un indirizzo
 locale su cui porsi in ascolto.
 
-La prima funzione della nostra intefaccia semplificata è \func{sockconn} che
+La prima funzione della nostra interfaccia semplificata è \func{sockconn} che
 permette di ottenere un socket, connesso all'indirizzo ed al servizio
 specificati. Il corpo della funzione è riportato in
 fig.~\ref{fig:sockconn_code}, il codice completo è nel file \file{SockUtil.c}
@@ -1700,7 +1700,7 @@ associato al socket (un numero positivo) in caso di successo, o -1 in caso di
 errore; per risolvere il problema di non poter passare indietro i valori di
 ritorno di \func{getaddrinfo} contenenti i relativi codici di
 errore\footnote{non si può avere nessuna certezza che detti valori siano
-  negativi, è questo è invece nessario per evitare ogni possibile ambiguità
+  negativi, è questo è invece necessario per evitare ogni possibile ambiguità
   nei confronti del valore di ritorno in caso di successo.} si sono stampati i
 messaggi d'errore direttamente nella funzione.
 
@@ -1711,7 +1711,7 @@ chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
 controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
 avviso di errore, azzerare \var{errno} ed uscire in caso di errore.  Dato che
 ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
-IPv4 che IPv6), mantre il servizio può essere in ascolto soltanto su uno solo
+IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
 di questi, si provvede a tentare la connessione per ciascun indirizzo
 restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
 lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
@@ -1906,7 +1906,7 @@ riassunti i valori che possono essere usati per l'argomento
   \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da
   Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono
   equivalenti ai numeri di protocollo di \file{/etc/protocols}, con una
-  eccesione specifica, che è quella del protocollo ICMP, per la quale non
+  eccezione specifica, che è quella del protocollo ICMP, per la quale non
   esista una costante, il che è comprensibile dato che il suo valore, 1, è
   quello che viene assegnato a \const{SOL\_SOCKET}.}
 
@@ -1943,7 +1943,7 @@ individuare qual 
 variabili.
 
 La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se
-poi l'opzione esprime una condizione logica, il valore è sempre un intero, am
+poi l'opzione esprime una condizione logica, il valore è sempre un intero, ma
 si dovrà usare un valore non nullo per abilitarla ed un valore nullo per
 disabilitarla.  Se invece l'opzione non prevede di dover ricevere nessun tipo
 di valore si deve impostare \param{optval} a \const{NULL}. Un piccolo numero
@@ -1983,7 +1983,7 @@ che viene usata come \itindex{value~result~argument}\textit{value result
   argument} per indicare, prima della chiamata della funzione, la lunghezza
 del buffer allocato per \param{optval} e per ricevere indietro, dopo la
 chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
-Se la dimenzione del buffer allocato per \param{optval} non è sufficiente si
+Se la dimensione del buffer allocato per \param{optval} non è sufficiente si
 avrà un errore.
 
 
@@ -2041,7 +2041,8 @@ tab.~\ref{tab:sock_opt_socklevel}.
     \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
                           non invia attraverso un gateway.\\
     \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-                          attiva o disattiva il \textit{broadcast}.\\
+                          attiva o disattiva il \itindex{broadcast}
+                          \textit{broadcast}.\\ 
     \const{SO\_SNDBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
                           imposta dimensione del buffer di trasmissione.\\
     \const{SO\_RCVBUF}   &$\bullet$&$\bullet$&         &\texttt{int}& 
@@ -2134,7 +2135,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   In genere questa opzione non è molto utilizzata se si ha a che fare con la
   lettura dei dati, in quanto è sempre possibile usare una \func{select} che
   consente di specificare un \textit{timeout}; l'uso di \func{select} non
-  consente però di impostare il timout per l'uso di \func{connect}, per avere
+  consente però di impostare il timeout per l'uso di \func{connect}, per avere
   il quale si può ricorrere a questa opzione. 
 
 % TODO verificare il timeout con un programma di test
@@ -2167,7 +2168,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   processo remoto connesso al socket; l'opzione è disponibile solo per socket
   unix-domain e può essere usata solo con \func{getsockopt}.  Utilizza per
   \param{optval} una apposita struttura \struct{ucred} (vedi
-  sez.~\ref{sec:unix_socket_xxx}). 
+  sez.~\ref{sec:unix_socket}). 
 
 \item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
   socket ad una particolare interfaccia, in modo che esso possa ricevere ed
@@ -2180,7 +2181,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   da uno zero e di lunghezza massima pari a \const{IFNAMSIZ}; l'opzione è
   effettiva solo per alcuni tipi di socket, ed in particolare per quelli della
   famiglia \const{AF\_INET}; non è invece supportata per i \textit{packet
-    socket} (vedi sez.~\ref{cha:advanced_socket_xxx}). 
+    socket} (vedi sez.~\ref{sec:socket_raw}). 
 
 \item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
   dei socket; l'opzione utilizza per \param{optval} un intero usato come
@@ -2213,7 +2214,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
   su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
-  \param{optval} un intero in cui verrà restituto il valore numerico che lo
+  \param{optval} un intero in cui verrà restituito il valore numerico che lo
   identifica (ad esempio \const{SOCK\_STREAM}). 
 
 \item[\const{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket
@@ -2227,19 +2228,20 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   di routing del kernel. Prende per \param{optval} un intero usato come valore
   logico.
 
-\item[\const{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast};
-  quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i
-  pacchetti inviati all'indirizzo di broadcast, e potranno scrivere pacchetti
-  su tale indirizzo.  Prende per \param{optval} un intero usato come valore
-  logico. L'opzione non ha effetti su un socket di tipo \const{SOCK\_STREAM}.
+\item[\const{SO\_BROADCAST}] questa opzione abilita il \itindex{broadcast}
+  \textit{broadcast}; quanto abilitata i socket di tipo \const{SOCK\_DGRAM}
+  riceveranno i pacchetti inviati all'indirizzo di \textit{broadcast}, e
+  potranno scrivere pacchetti su tale indirizzo.  Prende per \param{optval} un
+  intero usato come valore logico. L'opzione non ha effetti su un socket di
+  tipo \const{SOCK\_STREAM}.
 
-\item[\const{SO\_SNDBUF}] questa opzione imposta la dimenzione del buffer di
+\item[\const{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di
   uscita del socket. Prende per \param{optval} un intero indicante il numero
   di byte. Il valore di default ed il valore massimo che si può specificare
   come argomento per questa opzione sono impostabili tramiti gli opportuni
   valori di \func{sysctl} (vedi sez.~\ref{sec:sock_sysctl}).
 
-\item[\const{SO\_RCVBUF}] questa opzione imposta la dimenzione del buffer di
+\item[\const{SO\_RCVBUF}] questa opzione imposta la dimensione del buffer di
   ingresso del socket. Prende per \param{optval} un intero indicante il numero
   di byte. Il valore di default ed il valore massimo che si può specificare
   come argomento per questa opzione sono impostabili tramiti gli opportuni
@@ -2279,7 +2281,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 
 La descrizione sintetica del significato delle opzioni generiche dei socket,
 riportata nell'elenco in sez.~\ref{sec:sock_generic_options}, è
-necessariamente sintentica, alcune di queste però possono essere utilizzate
+necessariamente sintetica, alcune di queste però possono essere utilizzate
 per controllare delle funzionalità che hanno una notevole rilevanza nella
 programmazione dei socket.  Per questo motivo faremo in questa sezione un
 approfondimento sul significato delle opzioni generiche più importanti.
@@ -2306,17 +2308,17 @@ messaggio di \textit{keep-alive}\footnote{in sostanza un segmento ACK vuoto,
   cui sarà risposto con un altro segmento ACK vuoto.} verso l'altro capo della
 connessione se questa è rimasta senza traffico per più di due ore. Se è tutto
 a posto il messaggio viene ricevuto e verrà emesso un segmento ACK di
-risposta, alla cui ricezione ripartirà un'altro ciclo di attesa per altre due
+risposta, alla cui ricezione ripartirà un altro ciclo di attesa per altre due
 ore di inattività; il tutto avviene all'interno del kernel e le applicazioni
 non riceveranno nessun dato.
 
 In caso di problemi invece si possono avere i due casi già illustrati in
-sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del server:
+sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione precoce del server:
 il primo è quello in cui la macchina remota è caduta ed è stata riavviata, per
 cui dopo il riavvio la connessione non viene più riconosciuta,\footnote{si
   ricordi che un normale riavvio non ha questo effetto, in quanto in tal caso
   si passa per la chiusura del processo, e questo, come illustrato in
-  sez.~\ref{sec:file_close}, comporta la chiusura del socket col'invio di un
+  sez.~\ref{sec:file_close}, comporta la chiusura del socket col'invio di un
   segmento FIN all'altro capo della connessione, che verrà regolarmente
   chiusa.} in questo caso all'invio del messaggio di \textit{keep-alive} si
 otterrà come risposta un segmento RST che indica che l'altro capo non
@@ -2340,7 +2342,7 @@ restituito l'errore corrispondente.
 In generale questa opzione serve per individuare una caduta della connessione
 anche quando non si sta facendo traffico su di essa.  Viene usata
 principalmente sui server per evitare di mantenere impegnate le risorse che
-verrbbero dedicate a trattare delle connessioni che in realtà sono già
+verrebbero dedicate a trattare delle connessioni che in realtà sono già
 terminate (quelle che vengono anche chiamate connessioni
 \textsl{semi-aperte}); in tutti quei casi cioè in cui il server si trova in
 attesa di dati in ingresso su una connessione che non arriveranno mai perché o
@@ -2520,37 +2522,35 @@ si pu
 fare questa operazione per un socket TCP dato che su di essi si può sempre
 invocare \func{getsockname} una volta che si è completata la connessione.
 
-Infine il quarto caso è quello in cui si vuole effettivamente ottenere
-un \textit{completely duplicate binding}, quando cioè si vuole
-eseguire \func{bind} su un indirizzo ed una porta che sono già
-\textsl{legati} ad un altro socket.  Questo ovviamente non ha senso
-per il normale traffico di rete, in cui i pacchetti vengono scambiati
-direttamente fra due applicazioni; ma quando un sistema supporta il
-traffico in \itindex{multicast}\textit{multicast}, in cui una
-applicazione invia i pacchetti a molte altre (vedi
-sez.~\ref{sec:multicast_xxx}), allora ha senso che su una macchina i
-pacchetti provenienti dal traffico in multicast possano essere
-ricevuti da più applicazioni\footnote{l'esempio classico di traffico
-  in multicast è quello di uno streaming di dati (audio, video, ecc.),
-  l'uso del multicast consente in tal caso di trasmettere un solo
-  pacchetto, che potrà essere ricevuto da tutti i possibili
-  destinatari (invece di inviarne un duplicato a ciascuno); in questo
-  caso è perfettamente logico aspettarsi che sulla stessa macchina più
-  utenti possano lanciare un programma che permetta loro di ricevere
-  gli stessi dati.} o da diverse istanze della stessa applicazione.
+Infine il quarto caso è quello in cui si vuole effettivamente ottenere un
+\textit{completely duplicate binding}, quando cioè si vuole eseguire
+\func{bind} su un indirizzo ed una porta che sono già \textsl{legati} ad un
+altro socket.  Questo ovviamente non ha senso per il normale traffico di rete,
+in cui i pacchetti vengono scambiati direttamente fra due applicazioni; ma
+quando un sistema supporta il traffico in \itindex{multicast}
+\textit{multicast}, in cui una applicazione invia i pacchetti a molte altre
+(vedi sez.~\ref{sec:multicast_xxx}), allora ha senso che su una macchina i
+pacchetti provenienti dal traffico in \itindex{multicast} \textit{multicast}
+possano essere ricevuti da più applicazioni\footnote{l'esempio classico di
+  traffico in \textit{multicast} è quello di uno streaming di dati (audio,
+  video, ecc.), l'uso del \textit{multicast} consente in tal caso di
+  trasmettere un solo pacchetto, che potrà essere ricevuto da tutti i
+  possibili destinatari (invece di inviarne un duplicato a ciascuno); in
+  questo caso è perfettamente logico aspettarsi che sulla stessa macchina più
+  utenti possano lanciare un programma che permetta loro di ricevere gli
+  stessi dati.} o da diverse istanze della stessa applicazione.
 \itindex{multicast}
 
 In questo caso utilizzando \const{SO\_REUSEADDR} si consente ad una
-applicazione eseguire \func{bind} sulla stessa porta ed indirizzo
-usata da un'altra, così che anche essa possa ricevere gli stessi
-pacchetti (chiaramente la cosa non ha alcun senso per i socket TCP, ed
-infatti in questo tipo di applicazione è normale l'uso del protovollo
-UDP). La regola è che quando si hanno più applicazioni che hanno
-eseguito \func{bind} sulla stessa porta, di tutti pacchetti destinati
-ad un indirizzo di broadcast o di \itindex{multicast}
-\texttt{multicast} viene inviata una copia a ciascuna applicazione.
-Non è definito invece cosa accade qualora il pacchetto sia destinato
-ad un indirizzo normale (unicast).
+applicazione eseguire \func{bind} sulla stessa porta ed indirizzo usata da
+un'altra, così che anche essa possa ricevere gli stessi pacchetti (chiaramente
+la cosa non ha alcun senso per i socket TCP, ed infatti in questo tipo di
+applicazione è normale l'uso del protocollo UDP). La regola è che quando si
+hanno più applicazioni che hanno eseguito \func{bind} sulla stessa porta, di
+tutti pacchetti destinati ad un indirizzo di \itindex{broadcast}
+\textit{broadcast} o di \itindex{multicast} \textit{multicast} viene inviata
+una copia a ciascuna applicazione.  Non è definito invece cosa accade qualora
+il pacchetto sia destinato ad un indirizzo normale (unicast).
 
 Essendo questo un caso particolare in alcuni sistemi (come BSD) è stata
 introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
@@ -2593,7 +2593,7 @@ dal kernel.
 
 L'uso di \const{SO\_LINGER} con \func{setsockopt} permette di modificare (ed
 eventualmente ripristinare) questo comportamento in base ai valori passati nei
-campi della stuttura \struct{linger}, illustrata in
+campi della struttura \struct{linger}, illustrata in
 fig.~\ref{fig:sock_linger_struct}.  Fintanto che il valore del campo
 \var{l\_onoff} di \struct{linger} è nullo la modalità che viene impostata
 (qualunque sia il valore di \var{l\_linger}) è quella standard appena
@@ -2630,14 +2630,14 @@ allegati.
 La sezione indicata viene eseguita dopo aver effettuato la connessione e prima
 di chiamare la funzione di gestione, cioè fra le righe (\texttt{\small 12}) e
 (\texttt{\small 13}) del precedente esempio di fig.~\ref{fig:TCP_echo_fifth}.
-Il codice si limita semplicememente a controllare (\texttt{\small 3}) il
+Il codice si limita semplicemente a controllare (\texttt{\small 3}) il
 valore della variabile \var{reset} che assegnata nella gestione delle opzioni
 in corrispondenza all'uso di \texttt{-r} nella chiamata del client. Nel caso
 questa sia diversa da zero vengono impostati (\texttt{\small 5--6}) i valori
 della struttura \var{ling} che permettono una terminazione immediata della
-connessine. Questa viene poi usata nella successiva (\texttt{\small 7})
+connessione. Questa viene poi usata nella successiva (\texttt{\small 7})
 chiamata a \func{setsockopt}. Al solito si controlla (\texttt{\small 7--10})
-il valore di ritorno e si termina il programma in caso di errore, stampadone
+il valore di ritorno e si termina il programma in caso di errore, stampandone
 il valore.
 
 Infine l'ultima possibilità, quella in cui si utilizza effettivamente
@@ -2684,7 +2684,7 @@ tutte le altre costanti ad esse collegate sono definite in
                     \textbf{Descrizione}\\
     \hline
     \hline
-    \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+    \const{IP\_OPTIONS}         &$\bullet$&$\bullet$&&\texttt{void *}& %??? 
       Imposta o riceve le opzioni di IP.\\
     \const{IP\_PKTINFO}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Passa un messaggio di informazione.\\
@@ -2696,30 +2696,32 @@ tutte le altre costanti ad esse collegate sono definite in
       Passa un messaggio con le opzioni IP.\\
     \const{IP\_RETOPTS}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Passa un messaggio con le opzioni IP non trattate.\\
-    \const{IP\_TOS}             &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+    \const{IP\_TOS}             &$\bullet$&$\bullet$&         &\texttt{int}& 
       Imposta il valore del campo TOS.\\
-    \const{IP\_TTL}             &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+    \const{IP\_TTL}             &$\bullet$&$\bullet$&         &\texttt{int}& 
       Imposta il valore del campo TTL.\\
     \const{IP\_HDRINCL}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Passa l'intestazione di IP nei dati.\\
     \const{IP\_RECVERR}         &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Abilita la gestione degli errori.\\
-    \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
+    \const{IP\_MTU\_DISCOVER}   &$\bullet$&$\bullet$&         &\texttt{int}& 
       Imposta il Path MTU Discovery.\\
-    \const{IP\_MTU}             &$\bullet$&       &$\bullet$&\texttt{int}& 
+    \const{IP\_MTU}             &$\bullet$&         &         &\texttt{int}& 
       Legge il valore attuale della MTU.\\
     \const{IP\_ROUTER\_ALERT}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
       Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
-    \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Imposta il TTL per i pacchetti multicast.\\
+    \const{IP\_MULTICAST\_TTL}  &$\bullet$&$\bullet$&         &\texttt{int}& 
+      Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
     \const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Controlla il reinvio a se stessi dei dati di multicast.\\ 
-    \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&$\bullet$&\texttt{int}& 
-      Si unisce a un gruppo di multicast.\\
-    \const{IP\_DROP\_MEMBERSHIP}&        &$\bullet$&$\bullet$&\texttt{int}& 
-      Si sgancia da un gruppo di multicast.\\
-    \const{IP\_MULTICAST\_IF}   &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& 
-      Imposta l'interfaccia locale di un socket multicast.\\ 
+      Controlla il reinvio a se stessi dei dati di \itindex{multicast} 
+      \textit{multicast}.\\ 
+    \const{IP\_ADD\_MEMBERSHIP} &         &$\bullet$&   &\struct{ip\_mreqn}& 
+      Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+    \const{IP\_DROP\_MEMBERSHIP}&         &$\bullet$&   &\struct{ip\_mreqn}& 
+      Si sgancia da un gruppo di \textit{multicast}.\\
+    \const{IP\_MULTICAST\_IF}   &         &$\bullet$&   &\struct{ip\_mreqn}& 
+      Imposta l'interfaccia locale di un socket \itindex{multicast} 
+      \textit{multicast}.\\ 
    \hline
   \end{tabular}
   \caption{Le opzioni disponibili al livello \const{SOL\_IP}.} 
@@ -2740,12 +2742,12 @@ elenco:
   opzioni IP utilizzate per la spedizione, quando la si usa con
   \func{setsockopt} vengono impostate le opzioni specificate. L'uso di questa
   opzione richiede una profonda conoscenza del funzionamento del protocollo,
-  torneremo in parte sull'argomento in sez.~\ref{sec:sock_advanced_xxx}.
+  torneremo in parte sull'argomento in sez.~\ref{sec:sock_IP_options}.
 
 
 \item[\const{IP\_PKTINFO}] Quando abilitata l'opzione permette di ricevere
   insieme ai pacchetti un messaggio ancillare (vedi
-  sez.~\ref{sec:TCP_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
+  sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_PKTINFO} contenente
   una struttura \struct{pktinfo} (vedi fig.~\ref{fig:sock_pktinfo_struct}) che
   mantiene una serie di informazioni riguardo i pacchetti in arrivo. In
   particolare è possibile conoscere l'interfaccia su cui è stato ricevuto un
@@ -2773,23 +2775,33 @@ e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione 
 ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 \struct{pktinfo}). 
 
+L'opzione prende per \param{optval} un intero usato come valore logico, che
+specifica soltanto se insieme al pacchetto deve anche essere inviato o
+ricevuto il messaggio \const{IP\_PKTINFO} (vedi
+sez.~\ref{sec:net_ancillary_data}); il messaggio stesso dovrà poi essere
+letto o scritto direttamente con \func{recvmsg} e \func{sendmsg} (vedi
+sez.~\ref{sec:net_sendmsg}).
+
 
 \item[\const{IP\_RECVTOS}] Quando abilitata l'opzione permette di ricevere
-  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_TOS}, che
-  contiene un byte con il valore del campo \textit{Type of Service}
-  dell'intestazione IP del pacchetto stesso (vedi sez.~\ref{sec:IP_header}).
-  Prende per \param{optval} un intero usato come valore logico. 
+  insieme ai pacchetti un messaggio ancillare (vedi
+  sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_TOS}, che contiene un
+  byte con il valore del campo \textit{Type of Service} dell'intestazione IP
+  del pacchetto stesso (vedi sez.~\ref{sec:IP_header}).  Prende per
+  \param{optval} un intero usato come valore logico.
 
 \item[\const{IP\_RECVTTL}] Quando abilitata l'opzione permette di ricevere
-  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_RECVTTL},
-  contenente un byte con il valore del campo \textit{Time to Live}
-  dell'intestazione IP (vedi sez.~\ref{sec:IP_header}).  L'opzione richiede
-  per \param{optval} un intero usato come valore logico. L'opzione non è
-  supportata per socket di tipo \const{SOCK\_STREAM}.
+  insieme ai pacchetti un messaggio ancillare (vedi
+  sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_RECVTTL}, contenente
+  un byte con il valore del campo \textit{Time to Live} dell'intestazione IP
+  (vedi sez.~\ref{sec:IP_header}).  L'opzione richiede per \param{optval} un
+  intero usato come valore logico. L'opzione non è supportata per socket di
+  tipo \const{SOCK\_STREAM}.
 
 \item[\const{IP\_RECVOPTS}] Quando abilitata l'opzione permette di ricevere
-  insieme ai pacchetti un messaggio ancillare di tipo \const{IP\_OPTIONS},
-  contenente le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
+  insieme ai pacchetti un messaggio ancillare (vedi
+  sez.~\ref{sec:net_ancillary_data}) di tipo \const{IP\_OPTIONS}, contenente
+  le opzioni IP del protocollo (vedi sez.~\ref{sec:IP_options}). Le
   intestazioni di instradamento e le altre opzioni sono già riempite con i
   dati locali. L'opzione richiede per \param{optval} un intero usato come
   valore logico.  L'opzione non è supportata per socket di tipo
@@ -2801,12 +2813,16 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   per \param{optval} un intero usato come valore logico.  L'opzione non è
   supportata per socket di tipo \const{SOCK\_STREAM}.
 
-
 \item[\const{IP\_TOS}] L'opzione consente di leggere o impostare il campo
   \textit{Type of Service} dell'intestazione IP (vedi
   sez.~\ref{sec:IP_header}) che permette di indicare le priorità dei
-  pacchetti.  Il campo TOS è di 8 bit e l'opzione richiede per \param{optval}
-  un intero che ne contiene il valore. Sono definite anche alcune costanti che
+  pacchetti. Se impostato il valore verrà mantenuto per tutti i pacchetti del
+  socket; alcuni valori (quelli che aumentano la priorità) richiedono i
+  privilegi di amministrazione con la \itindex{capabilities} capability
+  \const{CAP\_NET\_ADMIN}.
+
+  Il campo TOS è di 8 bit e l'opzione richiede per \param{optval} un intero
+  che ne contenga il valore. Sono definite anche alcune costanti che
   definiscono alcuni valori standardizzati per il \textit{Type of Service},
   riportate in tab.~\ref{tab:IP_TOS_values}, il valore di default usato da
   Linux è \const{IPTOS\_LOWDELAY}, ma esso può essere modificato con le
@@ -2815,67 +2831,117 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   dal protocollo utilizzando l'opzione \const{SO\_PRIORITY} illustrata in
   sez.~\ref{sec:sock_generic_options}.
 
-
 \item[\const{IP\_TTL}] L'opzione consente di leggere o impostare il campo
   \textit{Time to Live} dell'intestazione IP (vedi sez.~\ref{sec:IP_header})
   per tutti i pacchetti associati al socket.  Il campo TTL è di 8 bit e
   l'opzione richiede che \param{optval} sia un intero, che ne conterrà il
   valore.
 
-
 \item[\const{IP\_HDRINCL}] Se abilitata l'utente deve fornire lui stesso
   l'intestazione IP in cima ai propri dati. L'opzione è valida soltanto per
   socket di tipo \const{SOCK\_RAW}, e quando utilizzata eventuali valori
   impostati con \const{IP\_OPTIONS}, \const{IP\_TOS} o \const{IP\_TTL} sono
   ignorati. In ogni caso prima della spedizione alcuni campi
-  dell'instestazione vengono comunque modificati dal kernel, torneremo
-  sull'argomento in sez.~\ref{sec:socket_raw_xxx}
-
+  dell'intestazione vengono comunque modificati dal kernel, torneremo
+  sull'argomento in sez.~\ref{sec:socket_raw}
 
 \item[\const{IP\_RECVERR}] Questa è una opzione introdotta con i kernel della
   serie 2.2.x, ed è specifica di Linux. Essa permette di usufruire di un
   meccanismo affidabile per ottenere un maggior numero di informazioni in caso
   di errori. Se l'opzione è abilitata tutti gli errori generati su un socket
   vengono memorizzati su una coda, dalla quale poi possono essere letti con
-  \func{recvmsg} (torneremo su questo in sez.~\ref{sec:TCP_ancillary_data}).
-  L'opzione richiede per \param{optval} un intero usato come valore logico;
-  l'opzione non è applicabile a socket di tipo \const{SOCK\_STREAM}.
-
-\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i
-  kernel della serie 2.2.x, ed è specifica di Linux.  L'opzione
-  permette di scrivere o leggere le impostazioni usate nella
-  determinazione della \textit{Maximum Tranfer Unit} (vedi
-  sez.~\ref{sec:net_lim_dim}) per il socket. Il valore di default è
-  determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di
-  \func{sysctl} per i socket di tipo \const{SOCK\_STREAM}, mentre è
-  diabilitato per tutti gli altri.
-
-\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
-    Tranfer Unit} di percorso del socket.  L'opzione richiede per
-  \param{optval} un intero che conterrà il valore della MTU in byte.  Questa è
-  una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
-  Linux.
+  \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) come messaggi ancillari
+  (torneremo su questo in sez.~\ref{sec:net_ancillary_data}) di tipo
+  \const{IP\_RECVERR}.  L'opzione richiede per \param{optval} un intero usato
+  come valore logico e non è applicabile a socket di tipo
+  \const{SOCK\_STREAM}.
+
+\itindbeg{Maximum~Transfer~Unit}
+\item[\const{IP\_MTU\_DISCOVER}] Questa è una opzione introdotta con i kernel
+  della serie 2.2.x, ed è specifica di Linux.  L'opzione permette di scrivere
+  o leggere le impostazioni della modalità usata per la determinazione della
+  \textit{Path Maximum Transfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) del
+  socket. L'opzione prende per \param{optval} un valore intero che indica la
+  modalità usata, da specificare con una delle costanti riportate in
+  tab.~\ref{tab:sock_ip_mtu_discover}.
+
+  \begin{table}[!htb]
+    \centering
+    \footnotesize
+    \begin{tabular}[c]{|l|r|p{7cm}|}
+      \hline
+      \multicolumn{2}{|c|}{\textbf{Valore}}&\textbf{Significato} \\
+      \hline
+      \hline
+      \const{IP\_PMTUDISC\_DONT}&0& Non effettua la ricerca dalla \textit{Path
+                                    MTU}.\\
+      \const{IP\_PMTUDISC\_WANT}&1& Utilizza il valore impostato per la rotta
+                                    utilizzata dai pacchetti (dal comando
+                                    \texttt{route}).\\ 
+      \const{IP\_PMTUDISC\_DO}  &2& Esegue la procedura di determinazione
+                                    della \textit{Path MTU} come richiesto
+                                    dall'\href{http://www.ietf.org/rfc/rfc1191.txt}{RFC~1191}.\\ 
+      \hline
+    \end{tabular}
+    \caption{Valori possibili per l'argomento \param{optval} di
+      \const{IP\_MTU\_DISCOVER}.} 
+    \label{tab:sock_ip_mtu_discover}
+  \end{table}
+
+  Il valore di default applicato ai socket di tipo \const{SOCK\_STREAM} è
+  determinato dal parametro \texttt{ip\_no\_pmtu\_disc} (vedi
+  sez.~\ref{sec:sock_sysctl}), mentre per tutti gli altri socket di default la
+  ricerca è disabilitata ed è responsabilità del programma creare pacchetti di
+  dimensioni appropriate e ritrasmettere eventuali pacchetti persi. Se
+  l'opzione viene abilitata, il kernel si incaricherà di tenere traccia
+  automaticamente della \textit{Path MTU} verso ciascuna destinazione, e
+  rifiuterà immediatamente la trasmissione di pacchetti di dimensioni maggiori
+  della MTU con un errore di \errval{EMSGSIZE}.\footnote{in caso contrario la
+    trasmissione del pacchetto sarebbe effettuata, ottenendo o un fallimento
+    successivo della trasmissione, o la frammentazione dello stesso.} 
+
+\item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Path MTU}
+  di percorso del socket.  L'opzione richiede per \param{optval} un intero che
+  conterrà il valore della \textit{Path MTU} in byte.  Questa è una opzione
+  introdotta con i kernel della serie 2.2.x, ed è specifica di Linux.
+
+  È tramite questa opzione che un programma può leggere, quando si è avuto un
+  errore di \errval{EMSGSIZE}, il valore della MTU corrente del socket. Si
+  tenga presente che per poter usare questa opzione, oltre ad avere abilitato
+  la scoperta della \textit{Path MTU}, occorre che il socket sia stato
+  esplicitamente connesso con \func{connect}. 
+
+  Ad esempio con i socket UDP si potrà ottenere una stima iniziale della
+  \textit{Path MTU} eseguendo prima una \func{connect} verso la destinazione,
+  e poi usando \func{getsockopt} con questa opzione. Si può anche avviare
+  esplicitamente il procedimento di scoperta inviando un pacchetto di grosse
+  dimensioni (che verrà scartato) e ripetendo l'invio coi dati aggiornati. Si
+  tenga infine conto che durante il procedimento i pacchetti iniziali possono
+  essere perduti, ed è compito dell'applicazione gestirne una eventuale
+  ritrasmissione. 
+
+\itindend{Maximum~Transfer~Unit}
 
 \item[\const{IP\_ROUTER\_ALERT}] Questa è una opzione introdotta con i
   kernel della serie 2.2.x, ed è specifica di Linux. Prende per
   \param{optval} un intero usato come valore logico. Se abilitata
   passa tutti i pacchetti con l'opzione \textit{IP Router Alert} (vedi
-  sez.\ref{sec:IP_options}) che devono essere inoltrati al socket
+  sez.~\ref{sec:IP_options}) che devono essere inoltrati al socket
   corrente. Può essere usata soltanto per socket di tipo raw.
 
+\itindbeg{multicast}
 \item[\const{IP\_MULTICAST\_TTL}] L'opzione permette di impostare o leggere il
-  valore del campo TTL per i pacchetti in uscita associati al socket. È
-  importante che questo valore sia il più basso possibile, ed il default è 1,
-  che significa che i pacchetti non potranno uscire dalla rete locale. Questa
-  opzione consente ai programmi che lo richiedono di superare questo limite.
-  L'opzione richiede per \param{optval} un intero che conterrà il valore del
-  TTL.
-
-\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i
-  dati che si inviano su un socket usato con il \itindex{multicast}
-  \texttt{multicast} vengano ricevuti anche sulla stessa macchina da
-  cui li si stanno inviando.  Prende per \param{optval} un intero
-  usato come valore logico.
+  valore del campo TTL per i pacchetti \textit{multicast} in uscita associati
+  al socket. È importante che questo valore sia il più basso possibile, ed il
+  default è 1, che significa che i pacchetti non potranno uscire dalla rete
+  locale. Questa opzione consente ai programmi che lo richiedono di superare
+  questo limite.  L'opzione richiede per
+  \param{optval} un intero che conterrà il valore del TTL.
+
+\item[\const{IP\_MULTICAST\_LOOP}] L'opzione consente di decidere se i dati
+  che si inviano su un socket usato con il \textit{multicast} vengano ricevuti
+  anche sulla stessa macchina da cui li si stanno inviando.  Prende per
+  \param{optval} un intero usato come valore logico.
 
   In generale se si vuole che eventuali client possano ricevere i dati che si
   inviano occorre che questa funzionalità sia abilitata (come avviene di
@@ -2883,17 +2949,16 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   disponibili in locale l'uso di questa opzione permette di disabilitare
   questo tipo di traffico.
 
-\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad
-  gruppo di \itindex{multicast} \texttt{multicast}, e può essere usata
-  solo con \func{setsockopt}. L'argomento \param{optval} in questo
-  caso deve essere una struttura di tipo \struct{ip\_mreqn},
-  illustrata in fig.~\ref{fig:ip_mreqn_struct}, che permette di
-  indicare, con il campo \var{imr\_multiaddr} l'indirizzo del gruppo
-  di multicast a cui ci si vuole unire, con il campo
-  \var{imr\_address} l'indirizzo dell'interfaccia locale con cui
-  unirsi al gruppo di multicast e con \var{imr\_ifindex} l'indice
-  dell'interfaccia da utilizzare (un valore nullo indica una
-  interfaccia qualunque).
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
+  \textit{multicast}, e può essere usata solo con \func{setsockopt}.
+  L'argomento \param{optval} in questo caso deve essere una struttura di tipo
+  \struct{ip\_mreqn}, illustrata in fig.~\ref{fig:ip_mreqn_struct}, che
+  permette di indicare, con il campo \var{imr\_multiaddr} l'indirizzo del
+  gruppo di \textit{multicast} a cui ci si vuole unire, con il campo
+  \var{imr\_address} l'indirizzo dell'interfaccia locale con cui unirsi al
+  gruppo di \textit{multicast} e con \var{imr\_ifindex} l'indice
+  dell'interfaccia da utilizzare (un valore nullo indica una interfaccia
+  qualunque).
 
   Per compatibilità è possibile utilizzare anche un argomento di tipo
   \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
@@ -2904,107 +2969,150 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
   \begin{minipage}[c]{15cm}
     \includestruct{listati/ip_mreqn.h}
   \end{minipage}
-  \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei socket
-    per le operazioni concernenti l'appartenenza ai gruppi di multicast.}
+  \caption{La struttura \structd{ip\_mreqn} utilizzata dalle opzioni dei
+    socket per le operazioni concernenti l'appartenenza ai gruppi di
+    \textit{multicast}.}
   \label{fig:ip_mreqn_struct}
 \end{figure}
 
+\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di \textit{multicast},
+  prende per \param{optval} la stessa struttura \struct{ip\_mreqn} (o
+  \struct{ip\_mreq}) usata anche per \const{IP\_ADD\_MEMBERSHIP}.
 
-\item[\const{IP\_DROP\_MEMBERSHIP}] Lascia un gruppo di
-  \itindex{multicast} \texttt{multicast}, prende per \param{optval} la
-  stessa struttura \struct{ip\_mreqn} (o \struct{ip\_mreq}) usata
-  anche per \const{IP\_ADD\_MEMBERSHIP}.
-
-\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per
-  i'utilizzo del multicast, ed utilizza come \param{optval} le stesse
-  strutture \struct{ip\_mreqn} o \struct{ip\_mreq} delle due
-  precedenti opzioni.
-
+\item[\const{IP\_MULTICAST\_IF}] Imposta l'interfaccia locale per l'utilizzo
+  del \textit{multicast}, ed utilizza come \param{optval} le stesse strutture
+  \struct{ip\_mreqn} o \struct{ip\_mreq} delle due precedenti opzioni.
 
+\itindend{multicast}
 \end{basedescript}
 
 
 
-
-
-\section{Altre funzioni di controllo}
+\section{La gestione attraverso le funzioni di controllo}
 \label{sec:sock_ctrl_func}
 
-Benché la maggior parte delle caratteristiche dei socket sia gestita
-attraverso le due funzioni \func{setsockopt} e \func{getsockopt}, alcune
-funzionalità possono essere impostate attraverso quelle che sono le funzioni
-classiche per il controllo delle proprietà dei file, cioè \func{fcntl} e
-\func{ioctl}. 
+Benché la maggior parte delle caratteristiche dei socket sia gestibile con le
+funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono
+essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già
+trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in
+quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito
+della loro applicazione a file descriptor associati a dei file normali; qui
+tratteremo invece i dettagli del loro utilizzo con file descriptor associati a
+dei socket.
 
 
-\subsection{L'uso di \func{ioctl} per i socket}
+\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici}
 \label{sec:sock_ioctl}
 
-Abbiamo già trattato l'uso di \func{ioctl} in sez.~\ref{sec:file_ioctl}, dove
-però ne abbiamo descritto le funzionalità nell'ambito della sua applicazione a
-file descriptor associati a file normali; tratteremo qui invece il suo uso
-specifico quando la si impiega su file descriptor associati a dei socket. 
-
-Quanto utilizzata con socket generici i valori utilizzabili per il secondo
-argomento della funzione (\param{request}, che indica il tipo di operazione
-richiesta) sono quelli riportati nel seguente elenco, il terzo argomento della
-funzione (quello usato per inviare o ricevere i dati) dipende dalla richiesta
-effettuata, ed è anch'esso illustrato nell'elenco in corrispondenza alla
-relativa richiesta:
+Tratteremo in questa sezione le caratteristiche specifiche delle funzioni
+\func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket
+generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e
+sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le
+operazioni ed i comandi che sono validi, o che hanno significati peculiari,
+quando queste funzioni vengono applicate a dei socket generici.
+
+Nell'elenco seguente si riportano i valori specifici che può assumere il
+secondo argomento della funzione \func{ioctl} (\param{request}, che indica il
+tipo di operazione da effettuare) quando essa viene applicata ad un socket
+generico. Nell'elenco si illustrerà anche, per ciascuna operazione, il tipo di
+dato usato come terzo argomento della funzione ed il significato che esso
+viene ad assumere.  Dato che in caso di lettura questi dati vengono restituiti
+come \itindex{value~result~argument} \textit{value result argument}, con
+queste operazioni il terzo argomento deve sempre essere passato come puntatore
+ad una variabile (o struttura) precedentemente allocata. Le costanti che
+identificano le operazioni sono le seguenti:
 \begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
-\item[\const{SIOCGSTAMP}] restituisce una struttura \struct{timeval} con la
-  marca temporale dell'ultimo pacchetto ricevuto sul socket, questa operazione
-  può essere utilizzata per effettuare delle misurazioni precise del tempo di
-  andata e ritorno\footnote{il cosiddetto \itindex{round~trip~time}
-    \textit{round trip time}.} dei pacchetti sulla rete.
+\item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura
+  \struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
+  socket, questa operazione può essere utilizzata per effettuare delle
+  misurazioni precise del tempo di andata e ritorno\footnote{il
+    \itindex{Round~Trip~Time} \textit{Round Trip Time} cui abbiamo già
+    accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete.
+
 \item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
   \textit{process group} a cui inviare i segnali \const{SIGIO} e
   \const{SIGURG} quando viene completata una operazione di I/O asincrono o
   arrivano dei dati urgenti. Il terzo argomento deve essere un puntatore ad una
   variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il
   \acr{pid} del processo, mentre un valore negativo indica (col valore
-  assoluto) il \textit{process group}. Senxa privilegi di amministratore o la
+  assoluto) il \textit{process group}. Senza privilegi di amministratore o la
   capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
   \textit{process group}.
 
-\item[\const{FIOASYNC}] .
+\item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket
+  relativamente all'eventuale processo o \itindex{process~group}
+  \textit{process group} cui devono essere inviati i segnali \const{SIGIO} e
+  \const{SIGURG}. Come per \const{SIOCSPGRP} l'argomento passato deve un
+  puntatore ad una variabile di tipo \type{pid\_t}, con lo stesso significato.
+  Qualora non sia presente nessuna impostazione verrà restituito un valore
+  nullo.
+
+\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
+  socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation})
+  che verrà inviato il segnale di \const{SIGIO} (o quanto impostato con
+  \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
+  sul socket.
+\end{basedescript}
+
+Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
+specifici; in questo caso il secondo argomento (\param{cmd}, che indica il
+comando) può assumere i due valori \const{FIOGETOWN} e \const{FIOSETOWN},
+mentre il terzo argomento dovrà essere un puntatore ad una variabile di tipo
+\type{pid\_t}. Questi due comandi sono una modalità alternativa di eseguire le
+stesse operazioni (lettura o impostazione del processo o del gruppo di
+processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
+\const{SIOCGPGRP} e \const{SIOCSPGRP}.
 
 
-\item[\const{SIOCGPGRP}] .
 
-\end{basedescript}
 
+\subsection{L'uso di \func{ioctl} per i socket IP}
+\label{sec:sock_ioctl_IP}
+
+Oltre alle caratteristiche che si possono impostare per i socket generici, ci
+sono operazioni specifiche valide per i socket IP, e per gli altri
+protocolli. 
+
+
+\subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
+\label{sec:sock_ioctl_TCP_UDP}
 
-\subsection{L'uso di \func{fcntl} per i socket}
-\label{sec:sock_fcntl}
 
-Come per \func{ioctl} abbiamo trattato l'uso di \func{fcntl} in
-sez.~\ref{sec:file_fcntl}, dove ne abbiamo descritto le funzionalità
-nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
-specifico quando la si impiega su file descriptor associati a dei socket. 
 
 
-\subsection{L'uso di \func{sysctl} per le proprietà della rete}
-\label{sec:sock_sysctl}
 
-Come ultimo argomento di questa sezione tratteremo l'uso della funzione
+\section{La gestione con \func{sysctl} ed il filesystem \texttt{/proc}}
+\label{sec:sock_sysctl_proc}
+
+Come ultimo argomento di questo capitolo tratteremo l'uso della funzione
 \func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in
 sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare
-impostazioni relative alle proprietà dei socket. La differenza nell'uso di
-\func{sysctl} rispetto alle funzioni viste finora è che esse consentono di
-controllare le proprietà di un singolo socket, mentre con \func{sysctl} si
+impostazioni relative alle proprietà dei socket.  Dato che le stesse
+funzionalità sono controllabili direttamente attraverso il filesystem
+\texttt{/proc}, le tratteremo attraverso i file presenti in quest'ultimo.
+
+
+
+\subsection{L'uso di \func{sysctl} e \texttt{/proc} per le proprietà della
+  rete}
+\label{sec:sock_sysctl}
+
+La differenza nell'uso di \func{sysctl} e del filesystem \texttt{/proc}
+rispetto a quello delle funzioni \func{ioctl} e \func{fcntl} visto in
+sez.~\ref{sec:sock_ctrl_func} o all'uso di \func{getsockopt} e
+\func{setsockopt} è che queste funzioni consentono di controllare le proprietà
+di un singolo socket, mentre con \func{sysctl} e con \texttt{/proc} si
 impostano proprietà (o valori di default) validi a livello dell'intero
-sistema.
-
-Le opzioni disponibili per le proprietà della rete sono riportate nella
-gerarchia dei valori impostabili con \func{sysctl}, sotto il nodo
-\texttt{net}, o, se acceduti tramite l'interfaccia del filesystem
-\texttt{/proc}, sotto \texttt{/proc/sys/net}. In genere sotto questa directory
-compaiono le sottodirectory (corrispondenti ad altrettanti sottonodi per
-\func{sysctl}) relative ai vari protocolli e tipi di interfacce su cui è
-possibile intervenire per effettuare impostazioni; un contenuto tipico di
-questa directory è il seguente:
+sistema, e cioè per tutti i socket.
+
+Le opzioni disponibili per le proprietà della rete, nella gerarchia dei valori
+impostabili con \func{sysctl}, sono riportate sotto il nodo \texttt{net}, o,
+se acceduti tramite l'interfaccia del filesystem \texttt{/proc}, sotto
+\texttt{/proc/sys/net}. In genere sotto questa directory compaiono le
+sottodirectory (corrispondenti ad altrettanti sottonodi per \func{sysctl})
+relative ai vari protocolli e tipi di interfacce su cui è possibile
+intervenire per effettuare impostazioni; un contenuto tipico di questa
+directory è il seguente:
 \begin{verbatim}
 /proc/sys/net/
 |-- core
@@ -3015,13 +3123,27 @@ questa directory 
 |-- token-ring
 `-- unix
 \end{verbatim}
-e sono presenti varie centinaia di diversi parametri; nel nostro caso ci
-limiteremo a vedere quelli più significativi.
+e sono presenti varie centinaia di parametri, molti dei quali non sono neanche
+documentati; nel nostro caso ci limiteremo ad illustrare quelli più
+significativi.
+
+Si tenga presente infine che se è sempre possibile utilizzare il filesystem
+\texttt{/proc} come sostituto di \func{sysctl}, dato che i valori di nodi e
+sottonodi di quest'ultima sono mappati come file e directory sotto
+\texttt{/proc/sys/}, non è vero il contrario, ed in particolare Linux consente
+di impostare alcuni parametri o leggere lo stato della rete a livello di
+sistema sotto \texttt{/proc/net}, dove sono presenti dei file che non
+corrispondono a nessun nodi di \func{sysctl}.
 
-Nella directory \texttt{/proc/sys/net/core} sono disponibili i parametri
-generici validi per tutti i socket, quelli descritti anche nella rispettiva
-pagina di manuale.\footnote{quella accessibile con \texttt{man 7 socket}.}
-I principali sono:
+
+
+\subsection{I valori di controllo per i socket generici}
+\label{sec:sock_gen_sysctl}
+
+Nella directory \texttt{/proc/sys/net/core} sono presenti i file
+corrispondenti ai parametri generici validi per tutti i socket. Quelli
+descritti anche nella pagina di manuale, accessibile con \texttt{man 7 socket}
+sono i seguenti:
 
 \begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
 \item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di
@@ -3039,17 +3161,45 @@ I principali sono:
   (rispettivamente flusso a regime e dimensione di picchi di emissione) che
   limita l'ammontare dei messaggi di avvertimento inviati dal kernel a causa
   di eventi esterni sulla rete.
-% TODO: spiegare il ucket filter e questa opzione
+% TODO: spiegare il bucket filter e questa opzione
 \item[\texttt{netdev\_max\_backlog}] numero massimo di pacchetti che possono
   essere contenuti nella coda di ingresso generale.
 \item[\texttt{optmem\_max}] lunghezza massima dei dati ancillari e di
-  controllo (vedi sez.~\ref{sec:TCP_ancillary_data}).
+  controllo (vedi sez.~\ref{sec:net_ancillary_data}).
 \end{basedescript}
 
-Nella directory \texttt{/proc/sys/net/ipv4} sono disponibili i parametri per i
-socket IPv4, descritti anche nella rispettiva pagina di
-manuale.\footnote{quella accessibile con \texttt{man 7 ip}.} I principali
-sono:
+Oltre a questi si trovano alcuni ulteriori file, la cui documentazione si
+trova nel file ...
+
+\begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
+\item[\texttt{dev\_weight}]
+
+\item[\texttt{lo\_cong}]
+
+\item[\texttt{mod\_cong}]
+
+\item[\texttt{no\_cong}]
+
+\item[\texttt{no\_cong\_thresh}]
+
+\item[\texttt{somaxconn}]
+
+\end{basedescript}
+
+
+\subsection{I valori di controllo per il protocollo IPv4}
+\label{sec:sock_ipv4_sysctl}
+
+Nella directory \texttt{/proc/sys/net/ipv4} sono presenti i file che
+corrispondono ai parametri dei socket che usano il protocollo IPv4, relativi
+quindi sia alle caratteristiche di IP, che a quelle degli altri protocolli che
+vengono usati all'interno di quest'ultimo (come ICMP, TCP e UDP).  Nella
+stessa directory sono presenti altri file che consentono anche di gestire le
+altre funzionalità generiche dei vari protocolli.
+
+I file che consentono di controllare le caratteristiche specifiche del
+protocollo IP in quanto tale, descritti anche nella pagina di manuale
+accessibile con \texttt{man 7 ip}, sono i seguenti:
 \begin{basedescript}{\desclabelwidth{3.2cm}\desclabelstyle{\nextlinelabel}}
 
 \item[\texttt{ip\_default\_ttl}] imposta il valore di default per il campo TTL
@@ -3080,7 +3230,7 @@ sono:
   valore iniziale maggiore di 1024 (o meglio ancora di 4096) per evitare
   conflitti con le porte usate dai servizi noti.
 
-\item[\texttt{ip\_no\_pmtu\_disc}] imposta la discliplina di ricerca della
+\item[\texttt{ip\_no\_pmtu\_disc}] imposta la disciplina di ricerca della
   \textit{Path MTU} (vedi sez.~\ref{sec:net_lim_dim} e
   sez.~\ref{sec:sock_ipv4_options}).
 
@@ -3100,14 +3250,73 @@ sono:
     di compilazione del kernel con l'opzione
     \texttt{CONFIG\_IP\_ALWAYS\_DEFRAG}.}
 
-\item[\texttt{}] 
+\item[\texttt{neigh/*}] La directory contiene i valori 
 
 
 \end{basedescript}
 
 
 
+I parametri specifici 
+
+
+% LocalWords:  socket sez dotted decimal resolver Domain Name Service cap DNS
+% LocalWords:  client fig LDAP Lightweight Access Protocol NIS Information Sun
+% LocalWords:  like netgroup Switch Solaris glibc libc uclib NSS tab shadow uid
+% LocalWords:  username group aliases ethers MAC address hosts networks rpc RPC
+% LocalWords:  protocols services dns db lib libnss org truelite it root res HS
+% LocalWords:  resource init netinet resolv int void conf host LOCALDOMAIN TCP
+% LocalWords:  options DEBUG debug AAONLY USEVC UDP PRIMARY IGNTC RECURSE INET
+% LocalWords:  DEFNAMES search STAYOPEN DNSRCH INSECURE NOALIASES HOSTALIASES
+% LocalWords:  IPv gethostbyname NOCHECKNAME KEEPTSIG TSIG BLAST RETRY retry NS
+% LocalWords:  retrans query FQDN Fully Qualified const char dname class type
+% LocalWords:  unsigned answer anslen CSNET Hesiod MIT CHAOS Chaosnet ANY BIND
+% LocalWords:  nameser compat Berkley MF CNAME SOA MB MR NULL WKS PTR HINFO TXT
+% LocalWords:  MINFO RP responsible person AFSDB AFS RT router NSAP SIG KEY PX
+% LocalWords:  GPOS AAAA LOC NXT EID NIMLOC nimrod SRV ATMA ATM NAPTR naming AF
+% LocalWords:  authority IXFR AXFR MAILB MAILA errno NOT FOUND RECOVERY TRY err
+% LocalWords:  AGAIN herror netdb string perror error hstrerror strerror struct
+% LocalWords:  hostent name addrtype length addr list sys af mygethost inet ret
+% LocalWords:  ntop deep copy buf size buflen result errnop value argument len
+% LocalWords:  ERANGE sethostent stayopen endhostent gethostbyaddr order pton
+% LocalWords:  getipnodebyname getipnodebyaddr flags num MAPPED ALL ADDRCONFIG
+% LocalWords:  freehostent ip getXXXbyname getXXXbyaddr servent getservbyname
+% LocalWords:  getservbyaddr netent getnetbyname getnetbyaddr protoent smtp udp
+% LocalWords:  getprotobyname getprotobyaddr getservbyport port tcp setservent
+% LocalWords:  getservent endservent setXXXent getXXXent endXXXent gethostent
+% LocalWords:  setnetent getnetent endnetent setprotoent getprotoent POSIX RFC
+% LocalWords:  endprotoent getaddrinfo getnameinfo nell' node service addrinfo
+% LocalWords:  hints linked addrlen socklen family socktype protocol sockaddr
+% LocalWords:  canonname next PF UNSPEC SOCK STREAM DGRAM bind INADDR loopback
+% LocalWords:  connect sendto NUMERICHOST EAI NONAME SYSTEM BADFLAGS ADDRFAMILY
+% LocalWords:  NODATA MEMORY FAIL errcode echo mygetaddr ptr casting Canonical
+% LocalWords:  freeaddrinfo getservname salen hostlen serv servlen l'OR NI NUL
+% LocalWords:  NOFQDN NAMEREQD NUMERICSERV MAXHOST MAXSERV sockconn SockUtil of
+% LocalWords:  descriptor hint fifth sockbind setsockopt getsockopt sock level
+% LocalWords:  optname optval optlen EBADF EFAULT EINVAL ENOPROTOOPT ENOTSOCK
+% LocalWords:  IPPROTO Stevens ICMP ICMPV ICMPv get KEEPALIVE OOBINLINE timeval
+% LocalWords:  RCVLOWAT SNDLOWAT RCVTIMEO SNDTIMEO BSDCOMPAT BSD PASSCRED ucred
+% LocalWords:  PEERCRED BINDTODEVICE REUSEADDR ACCEPTCONN DONTROUTE gateway MSG
+% LocalWords:  BROADCAST broadcast SNDBUF RCVBUF LINGER linger PRIORITY read IF
+% LocalWords:  OOB recvmsg kernel select write readv recv recvfrom EAGAIN send
+% LocalWords:  EWOULDBLOCK writev sendmsg raw domain SCM CREDENTIALS eth packet
+% LocalWords:  IFNAMSIZ capabilities capability ADMIN log trpt EADDRINUSE close
+% LocalWords:  listen routing sysctl shutdown Quality TOS keep alive ACK RST to
+% LocalWords:  ECONNRESET ETIMEDOUT keepalive echod fourth newsgroup WAIT reuse
+% LocalWords:  sockbindopt SockUtils homed completely binding RECVDSTADDR onoff
+% LocalWords:  PKTINFO getsockname multicast streaming unicast REUSEPORT reset
+% LocalWords:  stealing ling RECVTOS RECVTTL TTL RECVOPTS RETOPTS HDRINCL MTU
+% LocalWords:  RECVERR DISCOVER Path Discovery ALERT alert ADD MEMBERSHIP mreqn
+% LocalWords:  pktinfo ipi ifindex spec dst RECVIF Live IPTOS LOWDELAY Advanced
+% LocalWords:  Transfer Unit PMTUDISC DONT WANT route dall' pmtu EMSGSIZE imr
+% LocalWords:  multiaddr mreq fcntl ioctl request SIOCGSTAMP trip SIOCSPGRP pid
+% LocalWords:  process SIGIO SIGURG KILL FIOASYNC SIOCGPGRP filesystem proc ttl
+% LocalWords:  rmem wmem message cost burst bucket filter netdev backlog optmem
+% LocalWords:  forward dynaddr dial autoconfig local masquerading ipfrag high
+% LocalWords:  thresh low always defrag CONFIG SETSIG cmd FIOGETOWN FIOSETOWN
+
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+% LocalWords:  quest'ultime neigh dev weight cong mod somaxconn