Lavoro fatto a casa senza ADSL, correzioni multiple agli indici, documentato
[gapil.git] / sockctrl.tex
index 88804386e2fa9daddd6a4d80a249308011330076..585e3712e22092777a4b6d4420ef063be881524e 100644 (file)
@@ -34,7 +34,7 @@ porte o altre propriet
 \subsection{La struttura del \textit{resolver}}
 \label{sec:sock_resolver}
 
-\index{\textit{resolver}|(}
+\itindbeg{resolver}
 La risoluzione dei nomi è associata tradizionalmente al servizio del
 \textit{Domain Name Service} che permette di identificare le macchine su
 internet invece che per numero IP attraverso il relativo \textsl{nome a
@@ -117,7 +117,7 @@ dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
   funzioni di libreria, prevedendo un ordine di interrogazione predefinito e
   non modificabile (a meno di una ricompilazione delle librerie stesse).}
 
-\index{\textit{Name~Service~Switch}|(}
+\itindbeg{Name~Service~Switch}
 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
 eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo
 generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi
@@ -168,7 +168,7 @@ tab.~\ref{tab:sys_NSS_classes}.
   \label{tab:sys_NSS_classes}
 \end{table}
 
-Il sistema  del \textit{Name Service  Switch} è controllato dal  contenuto del
+Il sistema  del \textit{Name Service Switch} è controllato dal  contenuto del
 file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
   convezione  comune per  i  file  di configurazione  le  righe vuote  vengono
   ignorate  e  tutto  quello  che  segue un  carattere  ``\texttt{\#}''  viene
@@ -193,7 +193,7 @@ quello che conta sono le funzioni classiche che il \textit{resolver} mette a
 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
   tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
 quelle che tratteremo nelle sezioni successive.
-\index{\textit{Name~Service~Switch}|)}
+\itindend{Name~Service~Switch}
 
 
 \subsection{Le funzioni di interrogazione del \textit{resolver}}
@@ -610,16 +610,15 @@ Restituisce una stringa corrispondente ad un errore di risoluzione.
 \noindent che, come  l'analoga \func{strerror}, restituisce una stringa con un
 messaggio di errore già formattato, corrispondente al codice passato come
 argomento (che si presume sia dato da \var{h\_errno}).
-\index{\textit{resolver}|)}
-
 
+\itindend{resolver}
 
 
 \subsection{La risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
-La principale funzionalità del \index{\textit{resolver}}\textit{resolver}
-resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
+La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
 dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
 funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
 scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il
@@ -683,7 +682,7 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
 chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che
 questo non è molto comodo è stata definita\footnote{questa è una estensione
   fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
@@ -720,10 +719,10 @@ suoi risultati.
 Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
 fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
 programma che esegue una semplice interrogazione al
-\index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi
-ne stampa a video i risultati. Al solito il sorgente completo, che comprende
-il trattamento delle opzioni ed una funzione per stampare un messaggio di
-aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
+\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+stampa a video i risultati. Al solito il sorgente completo, che comprende il
+trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
+è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
 
 Il programma richiede un solo argomento che specifichi il nome da cercare,
 senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che
@@ -778,10 +777,10 @@ copiare il contenuto della sola struttura non 
 i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
 essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
 una chiamata, occorrerà eseguire quella che si chiama una
-\index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella
-  tecnica per cui, quando si deve copiare il contenuto di una struttura
-  complessa (con puntatori che puntano ad altri dati, che a loro volta possono
-  essere puntatori ad altri dati) si deve copiare non solo il contenuto della
+\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
+  per cui, quando si deve copiare il contenuto di una struttura complessa (con
+  puntatori che puntano ad altri dati, che a loro volta possono essere
+  puntatori ad altri dati) si deve copiare non solo il contenuto della
   struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
   contenuti in essa (e così via se vi sono altre sottostrutture con altri
   puntatori) e copiare anche i dati da questi referenziati.}
@@ -819,9 +818,9 @@ lunghezza di questo buffer devono essere indicati con gli argomenti
 \param{buf} e \param{buflen}.
 
 Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \index{\textit{value~result~argument}}\textit{value result argument}, si
-deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare
-il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
+come \itindex{value~result~argument}\textit{value result argument}, si deve
+specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
+codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
 puntatore che si userà per accedere i dati con \param{result}.
 
 In caso di successo entrambe le funzioni restituiscono un valore nullo,
@@ -883,17 +882,18 @@ usare la funzione \funcd{gethostbyaddr}, il cui prototipo 
 
 In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una
 appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si
-vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico,
-il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si
-  ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo
-  in realtà corrisponde ad un numero intero, da esprimere comunque in
-  \textit{network order}, non altrettanto avviene però per \var{in6\_addr},
-  pertanto è sempre opportuno inizializzare questi indirizzi con
-  \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).}  per un
-indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6,
-mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4
-o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà
-essere o \const{AF\_INET} o \const{AF\_INET6}.
+vuole risolvere. L'uso del tipo \texttt{char *} per questo argomento è
+storico, il dato dovrà essere fornito in una struttura
+\struct{in\_addr}\footnote{si ricordi che, come illustrato in
+  fig.~\ref{fig:sock_sa_ipv4_struct}, questo in realtà corrisponde ad un
+  numero intero, da esprimere comunque in \textit{network order}, non
+  altrettanto avviene però per \struct{in6\_addr}, pertanto è sempre opportuno
+  inizializzare questi indirizzi con \func{inet\_pton} (vedi
+  sez.~\ref{sec:sock_conv_func_gen}).}  per un indirizzo IPv4 ed una struttura
+\struct{in6\_addr} per un indirizzo IPv6, mentre in \param{len} se ne dovrà
+specificare la dimensione (rispettivamente 4 o 16), infine l'argomento
+\param{type} indica il tipo di indirizzo e dovrà essere o \const{AF\_INET} o
+\const{AF\_INET6}.
 
 La funzione restituisce, in caso di successo, un puntatore ad una struttura
 \struct{hostent}, solo che in questo caso la ricerca viene eseguita
@@ -969,7 +969,7 @@ tab.~\ref{tab:sock_getipnodebyname_flags}.
                             sistema è associata ad un indirizzo di tale tipo.\\
     \const{AI\_DEFAULT}   & il valore di default, è equivalente alla
                             combinazione di \const{AI\_ADDRCONFIG} e di
-                            \const{AI\_V4MAPPED)}.\\  
+                            \const{AI\_V4MAPPED}.\\  
     \hline
   \end{tabular}
   \caption{Valori possibili per i bit dell'argomento \param{flags} della
@@ -1173,9 +1173,9 @@ rimandando alle rispettive pagine di manuale.
     \textbf{Informazione}&\multicolumn{3}{|c|}{\textbf{Funzioni}}\\
     \hline
     \hline
-    indirizzo&\func{sethostent}&\func{gethostent}&\func{endhostent} \\
-    servizio &cd te\func{setservent}&\func{getservent}&\func{endservent}\\ 
-    rete     &\func{setnetent}&\func{getnetent}&\func{endnetent}\\ 
+    indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\
+    servizio  &\func{setservent} &\func{getservent} &\func{endservent}\\ 
+    rete      &\func{setnetent}  &\func{getnetent}  &\func{endnetent}\\ 
     protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ 
     \hline
   \end{tabular}
@@ -1248,6 +1248,16 @@ ricerche generiche sugli indirizzi, usando sia IPv4 che IPv6, e richiedere
 risoluzioni sui nomi dei servizi indipendentemente dal protocollo (ad esempio
 TCP o UDP) che questi possono utilizzare.
 
+Come ultimo argomento in \param{res} deve essere passato un puntatore ad una
+variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che verrà
+utilizzata dalla funzione per riportare (come \itindex{value~result~argument}
+\textit{value result argument}) i propri risultati. La funzione infatti è
+rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
+verranno riportati i risultati della risoluzione.  La funzione scriverà
+all'indirizzo puntato da \param{res} il puntatore iniziale ad una
+\itindex{linked~list}\textit{linked list} di strutture di tipo
+\struct{addrinfo} contenenti tutte le informazioni ottenute.
+
 \begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -1258,12 +1268,12 @@ TCP o UDP) che questi possono utilizzare.
   \label{fig:sock_addrinfo_struct}
 \end{figure}
 
-La struttura \struct{addrinfo}, la cui definizione\footnote{la definizione è
-  ripresa direttamente dal file \texttt{netdb.h} in questa struttura viene
-  dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato
-  per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo
-  standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi di
-  dati sono comunque equivalenti.} è riportata in
+Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la
+  definizione è ripresa direttamente dal file \texttt{netdb.h} in questa
+  struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come
+  tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto
+  dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi
+  di dati sono comunque equivalenti.} è riportata in
 fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare
 dei valori di controllo alla funzione, che in uscita, per ricevere i
 risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che
@@ -1273,7 +1283,7 @@ che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family},
 famiglia di indirizzi, il tipo di socket e il protocollo, in ingresso vengono
 usati per impostare una selezione (impostandone il valore nella struttura
 puntata da \param{hints}), mentre in uscita indicano il tipo di risultato
-contenuto nella struttura. 
+contenuto nella struttura.
 
 Tutti i campi seguenti vengono usati soltanto in uscita; il campo
 \var{ai\_addrlen} indica la dimensione della struttura degli indirizzi
@@ -1364,15 +1374,6 @@ bit della maschera.
   \label{tab:ai_flags_values}
 \end{table}
 
-Come ultimo argomento di \func{getaddrinfo} deve essere passato un puntatore
-ad una variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che
-verrà utilizzata dalla funzione per riportare (come \textit{value result
-  argument}) i propri risultati. La funzione infatti è rientrante, ed alloca
-autonomamente tutta la memoria necessaria in cui verranno riportati i
-risultati della risoluzione.  La funzione scriverà in \param{res} il puntatore
-iniziale ad una \index{\textit{linked~list}}\textit{linked list} di strutture
-di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute.
-
 La funzione restituisce un valore nullo in caso di successo, o un codice in
 caso di errore. I valori usati come codice di errore sono riportati in
 tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre
@@ -1414,7 +1415,7 @@ corrispondente 
     \const{EAI\_SYSTEM}  & c'è stato un errore di sistema, si può controllare
                            \var{errno} per i dettagli. \\
 %    \hline
-% estensioni GNU, trovarne la documentazione
+% TODO estensioni GNU, trovarne la documentazione
 %    \const{EAI\_INPROGRESS}& richiesta in corso. \\
 %    \const{EAI\_CANCELED}& la richiesta è stata cancellata.\\
 %    \const{EAI\_NOTCANCELED}& la richiesta non è stata cancellata. \\
@@ -1461,14 +1462,14 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
 \begin{figure}[!htb]
   \centering
   \includegraphics[width=10cm]{img/addrinfo_list}
-  \caption{La \index{\textit{linked~list}}\textit{linked list} delle strutture
+  \caption{La \itindex{linked~list}\textit{linked list} delle strutture
     \struct{addrinfo} restituite da \func{getaddrinfo}.}
   \label{fig:sock_addrinfo_list}
 \end{figure}
 
 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \index{\textit{resolver}}\textit{resolver}
-basato questa funzione, il cui corpo principale è riportato in
+elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+questa funzione, il cui corpo principale è riportato in
 fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
 la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
 dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di
@@ -1558,11 +1559,10 @@ IPv4 address:
 \end{Verbatim}
 %$
 
-Una volta estratti i risultati dalla
-\index{\textit{linked~list}}\textit{linked list} puntata da \param{res} se
-questa non viene più utilizzata si dovrà avere cura di disallocare
-opportunamente tutta la memoria, per questo viene fornita l'apposita funzione
-\funcd{freeaddrinfo}, il cui prototipo è:
+Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
+di disallocare opportunamente tutta la memoria, per questo viene fornita
+l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
 \begin{functions}
   \headdecl{netdb.h} 
 
@@ -1581,7 +1581,7 @@ per \param{res}.
 
 Si tenga presente infine che se si copiano i risultati da una delle strutture
 \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \index{\textit{deep~copy}}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
 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. 
@@ -1979,11 +1979,12 @@ di \func{setsockopt}, anche se non 
 per entrambe le funzioni. In questo caso \param{optval} viene usato per
 ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
 letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \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 avrà un errore.
+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
+avrà un errore.
 
 
 
@@ -2136,7 +2137,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   consente però di impostare il timout per l'uso di \func{connect}, per avere
   il quale si può ricorrere a questa opzione. 
 
-% verificare con un programma di test
+% TODO verificare il timeout con un programma di test
 
 \item[\const{SO\_SNDTIMEO}] l'opzione permette di impostare un tempo massimo
   sulle operazioni di scrittura su un socket, ed usa gli stessi valori di
@@ -2184,21 +2185,21 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \item[\const{SO\_DEBUG}] questa opzione abilita il debugging delle operazioni
   dei socket; l'opzione utilizza per \param{optval} un intero usato come
   valore logico, e può essere utilizzata solo da un processo con i privilegi
-  di amministratore (in particolare con la \textit{capability}
-  \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre dell'opportuno
-  supporto nel kernel;\footnote{deve cioè essere definita la macro di
-    preprocessore \macro{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
-    dei sorgenti del kernel, questo è sempre vero nei kernel delle serie
-    superiori alla 2.3, per i kernel delle serie precedenti invece è
-    necessario aggiungere a mano detta definizione; è inoltre possibile
-    abilitare anche il tracciamento degli stati del TCP definendo la macro
-    \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}  quando viene
-  abilitata una serie di messaggi con le informazioni di debug vengono inviati
-  direttamente al sistema del kernel log.\footnote{si tenga presente che il
-    comportamento è diverso da quanto avviene con BSD, dove l'opzione opera
-    solo sui socket TCP, causando la scrittura di tutti i pacchetti inviati
-    sulla rete su un buffer circolare che viene letto da un apposito
-    programma, \cmd{trpt}.} 
+  di amministratore (in particolare con la \itindex{capabilities}
+  \textit{capability} \const{CAP\_NET\_ADMIN}).  L'opzione necessita inoltre
+  dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la
+    macro di preprocessore \macro{SOCK\_DEBUGGING} nel file
+    \file{include/net/sock.h} dei sorgenti del kernel, questo è sempre vero
+    nei kernel delle serie superiori alla 2.3, per i kernel delle serie
+    precedenti invece è necessario aggiungere a mano detta definizione; è
+    inoltre possibile abilitare anche il tracciamento degli stati del TCP
+    definendo la macro \macro{STATE\_TRACE} in \file{include/net/tcp.h}.}
+  quando viene abilitata una serie di messaggi con le informazioni di debug
+  vengono inviati direttamente al sistema del kernel log.\footnote{si tenga
+    presente che il comportamento è diverso da quanto avviene con BSD, dove
+    l'opzione opera solo sui socket TCP, causando la scrittura di tutti i
+    pacchetti inviati sulla rete su un buffer circolare che viene letto da un
+    apposito programma, \cmd{trpt}.}
 
 \item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
   \func{bind} su indirizzi locali che siano già in uso da altri socket;
@@ -2264,7 +2265,8 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
   valori del campo \textit{type of service} (noto come TOS, vedi
   sez.~\ref{sec:IP_header}) per i pacchetti uscenti. Per impostare una
   priorità al di fuori dell'intervallo di valori fra 0 e 6 sono richiesti i
-  privilegi di amministratore con la capability \const{CAP\_NET\_ADMIN}.
+  privilegi di amministratore con la \itindex{capabilities} capability
+  \const{CAP\_NET\_ADMIN}.
 
 \item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
   può essere utilizzata soltanto con \func{getsockopt} e prende per
@@ -2283,7 +2285,7 @@ programmazione dei socket.  Per questo motivo faremo in questa sezione un
 approfondimento sul significato delle opzioni generiche più importanti.
 
 
-\index{\texttt{SO\_KEEPALIVE} (costante)|(} 
+\index{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|(}
 \subsubsection{L'opzione \const{SO\_KEEPALIVE}}
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
@@ -2365,8 +2367,7 @@ presente per
 necessariamente ad una reale conclusione della connessione, il problema
 potrebbe anche essere dovuto ad un problema di routing che perduri per un
 tempo maggiore di quello impiegato nei vari tentativi di ritrasmissione del
-\textit{keep-alive} (anche se questa non è una una condizione molto
-probabile).
+\textit{keep-alive} (anche se questa non è una condizione molto probabile).
 
 Come esempio dell'utilizzo di questa opzione introduciamo all'interno del
 nostro server per il servizio \textit{echo} la nuova opzione \texttt{-k} che
@@ -2385,10 +2386,11 @@ tutte le volte che un processo figlio viene eseguito in risposta ad una
 connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17})
 che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso,
 attivando il relativo comportamento.
-\index{\texttt{SO\_KEEPALIVE} (costante)|)}
+\index{costante!{SO\_KEEPALIVE}@{{\tt  {SO\_KEEPALIVE}}}|)}
 
 
-\index{\texttt{SO\_REUSEADDR} (costante)|(}
+
+\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|(}
 \subsubsection{L'opzione \const{SO\_REUSEADDR}}
 
 La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
@@ -2560,10 +2562,9 @@ questa opzione.\footnote{Questa restrizione permette di evitare il cosiddetto
   primo programma a consentirlo, avendo usato fin dall'inizio
   \const{SO\_REUSEADDR}.}  
 
-\index{\texttt{SO\_REUSEADDR} (costante)|)}
-
+\index{costante!{SO\_REUSEADDR}@{{\tt  {SO\_REUSEADDR}}}|)}
 
-\index{\texttt{SO\_LINGER} (costante)|(} 
+\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|(}
 \subsubsection{L'opzione \const{SO\_LINGER}}
 
 La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
@@ -2649,9 +2650,7 @@ secondi\footnote{questa 
   completamento della trasmissione dei dati sul buffer.}  pari al valore
 specificato in \var{l\_linger}.
 
-
-
-\index{\texttt{SO\_LINGER} (costante)|)}
+\index{costante!{SO\_LINGER}@{{\tt  {SO\_LINGER}}}|)}
 
 
 
@@ -2838,8 +2837,10 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di
 
 \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 usante nella determinazione della \textit{Maximum
-    Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket.
+  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}.
 
 \item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum
     Tranfer Unit} di percorso del socket.  L'opzione richiede per
@@ -2869,7 +2870,32 @@ 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}]
+\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di
+  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).  
+
+  Per compatibilità è possibile utilizzare anche un argomento di tipo
+  \struct{ip\_mreq}, una precedente versione di \struct{ip\_mreqn}, che
+  differisce da essa soltanto per l'assenza del campo \var{imr\_ifindex}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \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.}
+  \label{fig:ip_mreqn_struct}
+\end{figure}
+
+
+
 
 \item[\const{IP\_DROP\_MEMBERSHIP}]