+ socket} (vedi sez.~\ref{cha:advanced_socket_xxx}).
+
+
+\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}.}
+
+\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
+ \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per
+ \param{optval} un intero usato come valore logico. Questa opzione modifica
+ il comportamento normale dell'interfaccia dei socket che fa fallire
+ l'esecuzione della funzione \func{bind} con un errore di
+ \errcode{EADDRINUSE} quando l'indirizzo locale\footnote{più propriamente il
+ controllo viene eseguito sulla porta.} è già in uso da parte di un altro
+ socket.
+
+ Come Stevens sottolinea in \cite{UNP1} si distinguono quattro casi per
+ l'utilizzo di questa opzione; il primo è quello in cui un server è terminato
+ ma esistono ancora dei processi figli che mantengono attiva almeno una
+ connessione remota che utilizza l'indirizzo locale; quando si riavvia il
+ server questo viene bloccato sulla chiamata a \func{bind} dato che la porta
+ è ancora utilizzata in una connessione esistente.\footnote{questa è una
+ delle domande più frequenti sui newsgroup dedicati allo sviluppo, in
+ quanto è piuttosto comune in questa situazione quando si sta sviluppando
+ un server che si ferma e si riavvia in continuazione.} Inoltre se si usa
+ il protocollo TCP questo può avvenire anche dopo che l'ultimo processo
+ figlio è terminato, dato che la connessione può restare attiva anche dopo la
+ chiusura del socket mantenendosi nello stato \texttt{TIME\_WAIT}.
+
+ Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a
+ \func{bind} si consente a quest'ultima di avere comunque successo anche se
+ la connessione è attiva (o nello stato \texttt{TIME\_WAIT}). È bene però
+ ricordare (si riveda quanto detto in sez.~\ref{sec:TCP_time_wait}) che la
+ presenza dello stato \texttt{TIME\_WAIT} ha una ragione, ed infatti se si
+ usa questa opzione esiste sempre una probabilità, anche se estremamente
+ remota,\footnote{perché ciò avvenga infatti non solo devono coincidere gli
+ indirizzi IP e le porte degli estremi della nuova connessione, ma anche i
+ numeri di sequenza dei pacchetti, e questo è estremamente improbabile.}
+ che eventuali pacchetti rimasti intrappolati in una precedente connessione
+ possano finire fra quelli di una nuova.
+
+ Il secondo caso in cui viene usata questa opzione è quando si ha una
+ macchina cui sono assegnati diversi numeri IP (o come suol dirsi
+ \textit{multi-homed}) e si vuole porre in ascolto sulla stessa porta un
+ programma diverso (o una istanza diversa dello stesso programma) per
+ indirizzi IP diversi. Si ricordi infatti che è sempre possibile indicare a
+ \func{bind} di collegarsi solo su di un indirizzo specifico; in tal caso se
+ un altro programma cerca di riutilizzare la stessa porta (anche specificando
+ un indirizzo diverso) otterrà un errore a meno di non aver preventivamente
+ impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche
+ possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà
+ il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la
+ porta non risulti occupata da una precedente chiamata più specifica. Infine
+ si tenga presente che con il protocollo TCP non è mai possibile far partire
+ server che eseguano \func{bind} sullo stesso indirizzo e la stessa porta,
+ cioè ottenere quello che viene chiamato un \textit{completely duplicate
+ binding}.
+
+ Il terzo impiego è simile al precedente e prevede l'uso di \func{bind}
+ all'interno dello stesso programma per associare indirizzi diversi a socket
+ diversi. Il meccanismo funziona fintanto che ciascuna chiamata usa degli
+ indirizzi remoti diversi. In genere questo viene fatto per i socket UDP, per
+ ottenere l'indirizzo remoto, sui sistemi per i quali non è diponibile
+ l'opzione \const{IP\_RECVDSTADDR}, non viene usata per TCP dato che su tali
+ socket si può sempre invocare \func{getsockname} una volta che si è
+ completata la connessione.