+L'opzione è utilizzabile solo per socket di tipo \const{SOCK\_DGRAM}. Questa è
+una opzione introdotta con i kernel della serie 2.2.x, ed è specifica di
+Linux;\footnote{non dovrebbe pertanto essere utilizzata se si ha a cuore la
+ portabilità.} essa permette di sostituire le opzioni \const{IP\_RECVDSTADDR}
+e \const{IP\_RECVIF} presenti in altri Unix (la relativa informazione è quella
+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 (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 (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 (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
+ \const{SOCK\_STREAM}.
+
+\item[\const{IP\_RETOPTS}] Identica alla precedente \const{IP\_RECVOPTS}, ma
+ in questo caso restituisce i dati grezzi delle opzioni, senza che siano
+ riempiti i capi di instradamento e le marche temporali. 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\_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. 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
+ funzionalità del cosiddetto \textit{Advanced Routing}. Si ricordi che la
+ priorità dei pacchetti può essere impostata anche in maniera indipendente
+ 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'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} (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
+ 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 \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
+ default). Qualora però non si voglia generare traffico per dati che già sono
+ 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
+ \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
+ 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
+ \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\_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}