+La tabella elenca le costanti che identificano le singole opzioni da usare
+come valore per \param{optname}; le due colonne seguenti indicano per quali
+delle due funzioni (\func{getsockopt} o \func{setsockopt}) l'opzione è
+disponibile, mentre la colonna successiva indica, quando di ha a che fare con
+un valore di \param{optval} intero, se l'opzione è da considerare un numero o
+un valore logico. Si è inoltre riportato sulla quinta colonna il tipo di dato
+usato per \param{optval} ed una breve descrizione del significato delle
+singole opzioni sulla sesta.
+
+
+Dato che le descrizioni di tab.~\ref{tab:sock_opt_socklevel} sono estremamente
+sommarie, vale la pena entrare in dettagli maggiori; questo ci consentirà
+anche di trattare i vari casi particolari, dato che nonostante queste opzioni
+siano indicate al livello generico, alcune di esse han senso solo per alcuni
+tipi di socket. L'elenco dettagliato del significato di ciascuna di esse è
+allora il seguente:
+\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SO\_KEEPALIVE}] una connessione può restare attiva senza che non
+ debba essere effettuato nessun traffico su di essa; in in certi casi può
+ essere utile controllarne lo stato per accorgersi di eventuali problemi, per
+ questo, se si imposta questa opzione, è cura del kernel inviare degli
+ appositi messaggi sulla rete (detti appunto \textit{keep-alive}) per
+ verificare se la connessione è attiva. L'opzione funziona soltanto con
+ socket che supportino le connessioni (non ha senso per socket UDP ad
+ esempio), ed utilizza per \param{optval} un intero usato come valore logico.
+
+ L'opzione si applica principalmente ai socket TCP. Con le impostazioni di
+ default (che sono riprese da BSD) Linux emette un messaggio di
+ \textit{keep-alive} 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 ore di inattività; tutto
+ ciò viene effettuato dal 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: il primo è quello in cui la macchina remota non riconosce più la
+ connessione, ad esempio perché ha avuto un crollo ed è stata
+ riavviata,\footnote{si ricordi che un normale riavvio non ha questo effetto,
+ in quanto si passa per la chiusura del processo che invia un segmento FIN
+ all'altro capo della connessione.} per cui si otterrà come risposta un
+ RST. In tal caso il socket viene chiuso dopo aver impostato un errore
+ \errcode{ECONNRESET}.
+
+ Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
+ più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di
+ 75 secondi ad un massimo di 9 volte\footnote{entrambi questi valori possono
+ essere opportunamente modificati con gli opportuni parametri illustrati in
+ sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a
+ livello di kernel ed i valori saranno applicati a \textsl{tutti} i
+ socket.} (per un totale di 11 minuti e 15 secondi) dopo di che se non si è
+ ricevuta nessuna risposta il socket viene chiuso dopo aver impostato un
+ errore di \errcode{ETIMEDOUT}. Se invece si riceve in risposta ad uno di
+ questi messaggi un pacchetto ICMP di destinazione irraggiungibile verrà
+ restituito l'errore corrispondente.
+
+ In generale questa opzione serve per individuare un crash della macchina
+ all'altro capo della connessione,\footnote{il crash di un processo di nuovo
+ comporta la chiusura di tutti i file che aveva aperti e la relativa
+ emissione degli opportuni segmenti FIN nel caso dei socket.} e viene usata
+ sui server per evitare di mantenere impegnate le risorse dedicate a trattare
+ delle connessioni in realtà terminate; abilitandola le connessioni
+ effettivamente terminate vengono chiuse ed una \func{select} potrà rilevare
+ la conclusione delle stesse e ricevere il relativo errore. Si tenga però
+ presente che non si ha la certezza assoluta che un errore di
+ \errcode{ETIMEDOUT} corrisponda ad una reale conclusione della connessione,
+ il problema potrebbe 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}.
+
+
+
+\item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
+ \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
+ socket (e sono quindi letti con una normale \func{read}) invece che restare
+ disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di
+ \func{recvmsg}. Tratteremo l'argomento in dettaglio in
+ sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
+ supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
+ esempio), ed utilizza per \param{optval} un intero usato come valore logico.
+
+
+
+\item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
+ numero minimo di byte che devono essere presenti nel buffer di ricezione
+ perché il kernel passi i dati all'utente, restituendoli ad una \func{read} o
+ segnalando ad una \func{select} (vedi sez.~\ref{sec:TCP_sock_select}) che ci
+ sono dati in ingresso. L'opzione utilizza per \param{optval} un intero che
+ specifica il numero di byte, ma con Linux questo valore è sempre 1 e non può
+ essere cambiato; \func{getsockopt} leggerà questo valore mentre
+ \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}.
+
+
+\item[\const{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il
+ numero minimo di byte che devono essere presenti nel buffer di scrittura
+ perché il kernel li invii al protocollo successivo, consentendo ad una
+ \func{write} di ritornare o segnalando ad una \func{select} (vedi
+ sez.~\ref{sec:TCP_sock_select}) che è possibile eseguire una scrittura.
+ L'opzione utilizza per \param{optval} un intero che specifica il numero di
+ byte, ma con Linux questo valore è sempre 1 e non può essere cambiato;
+ \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un
+ errore di \errcode{ENOPROTOOPT}.
+
+
+\item[\const{SO\_RCVTIMEO}] l'opzione permette di impostare un tempo massimo
+ sulle operazioni di lettura da un socket, e prende per \param{optval} una
+ struttura di tipo \struct{timeval} (vedi fig.~\ref{fig:sys_timeval_struct})
+ identica a quella usata con \func{select}. Con \func{getsockopt} si può
+ leggere il valore attuale, mentre con \func{setsockopt} si imposta il tempo
+ voluto, usando un valore nullo per \struct{timeval} il timeout viene
+ rimosso.
+
+ Se l'opzione viene attivata tutte le volte che una delle funzioni di lettura
+ (\func{read}, \func{readv}, \func{recv}, \func{recvfrom} e \func{recvmsg})
+ si blocca in attesa di dati per un tempo maggiore di quello impostato, essa
+ ritornerà un valore -1 e la variabile \var{errno} sarà impostata con un
+ errore di \errcode{EAGAIN} e \errcode{EWOULDBLOCK}, così come sarebbe
+ avvenuto se si fosse aperto il socket in modalità non bloccante.
+
+\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
+ \const{SO\_RCVTIMEO}. In questo caso però si avrà un errore di
+ \errcode{EAGAIN} o \errcode{EWOULDBLOCK} per le funzioni di scrittura
+ \func{write}, \func{writev}, \func{send}, \func{sendfrom} e \func{sendmsg}
+ qualora queste restino bloccate per un tempo maggiore di quello specificato.
+
+\item[\const{SO\_BSDCOMPAT}] questa opzione abilita la compatibilità con il
+ comportamento di BSD (in particolare ne riproduce i bug). Attualmente è una
+ opzione usata solo per il protocollo UDP e ne è prevista la rimozione in
+ futuro. L'opzione utilizza per \param{optval} un intero usato come valore
+ logico.
+
+ Quando viene abilitata gli errori riportati da messaggi ICMP per un socket
+ UDP non vengono passati al programma in user space. Con le versioni 2.0.x
+ del kernel erano anche abilitate altre opzioni per i socket raw, che sono
+ state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
+ piuttosto che usare questa funzione.
+
+\item[\const{SO\_PASSCRED}] questa opzione abilita la ricezione dei messaggi
+ di controllo \const{SCM\_CREDENTIALS} dei socket unix-domain. Prende per
+ \param{optval} un intero usato come valore logico.
+
+\item[\const{SO\_PEERCRED}] questa opzione restituisce le credenziali del
+ processo remoto connesso al socket; l'opzione è disponibile solo per socket
+ unix-domain e può essere usata solo con \func{getsockopt}. Prende come
+ valore per \param{optval} una apposita struttura \struct{ucred} (vedi
+ sez.~\ref{sec:unix_socket_xxx}).
+
+\item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
+ socket ad una particolare interfaccia interfaccia, in modo che esso possa
+ ricevere ed inviare pacchetti solo su quella. L'opzione richiede per
+ \param{optval} il puntatore ad una stringa contenente il nome
+ dell'interfaccia (ad esempio \texttt{eth0}); se si utilizza una stringa
+ nulla o un valore nullo per \param{optlen} si rimuove un precedente
+ collegamento.
+
+ Il nome della interfaccia deve essere specificato con una stringa terminata
+ 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}).
+
+
+\item[\const{SO\_DEBUG}]
+
+\item[\const{SO\_REUSEADDR}]
+
+\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 valore intero in cui verrà restituto il valore numerico
+ che lo identifica (ad esempio \const{SOCK\_STREAM}).
+
+\item[\const{SO\_ACCEPTCONN}]
+\item[\const{SO\_DONTROUTE}]
+\item[\const{SO\_BROADCAST}]
+\item[\const{SO\_SNDBUF}]
+\item[\const{SO\_RCVBUF}]
+\item[\const{SO\_LINGER}]
+\item[\const{SO\_PRIORITY}]
+\item[\const{SO\_ERROR}]
+\end{basedescript}