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}}
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{SO\_KEEPALIVE}] una connessione può restare attiva se non viene
effettuato alcun traffico su di essa; in certi casi però può essere utile
controllarne lo stato per accorgersi di eventuali problemi. Per questo, se
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 \texttt{SOCK\_DEBUGGING} nel file \file{include/net/sock.h}
+ 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
- \texttt{STATE\_TRACE} in \file{include/net/tcp.h}.} quando viene
+ \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
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
+ 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
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ò
+ 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
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 risulti libera. 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}.
+ 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. Vale in questo caso quanto detto in precedenza, l'unica differenza
- è che in questo caso le diverse chiamate a \func{bind} sono eseguite
- all'interno dello stesso programma.
+ all'interno dello stesso programma per associare indirizzi locali diversi a
+ socket diversi. In genere questo viene fatto per i socket UDP quando è
+ necessario ottenere l'indirizzo a cui sono rivolte le richieste del client
+ ed il sistema non supporta l'opzione \const{IP\_RECVDSTADDR};\footnote{nel
+ caso di Linux questa opzione è stata supportata per in certo periodo nello
+ sviluppo del kernel 2.1.x, ma è in seguito stata soppiantata dall'uso di
+ \const{IP\_PKTINFO} (vedi sez.~\ref{sec:sock_ipv4_options}).} in tale modo
+ si può sapere a quale socket corrisponde un certo indirizzo. Non ha senso
+ per 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 si vuole effettivamente ottenere un
+ \textit{completely duplicate binding}
\item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
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\_LINGER}]
\item[\const{SO\_PRIORITY}] questa opzione permette di impostare le priorità
per tutti i pacchetti che sono inviati sul socket, prende per \param{optval}
un valore intero. Con questa opzione il kernel usa il valore per ordinare le
- priorità sulle code di rete,\foonote{questo richiede che sia abilitato il
+ priorità sulle code di rete,\footnote{questo richiede che sia abilitato il
sistema di \textit{Quality of Service} disponibile con le opzioni di
routing avanzato.} i pacchetti con priorità più alta vengono processati
per primi, in modalità che dipendono dalla disciplina di gestione della
coda. Nel caso di protocollo IP questa opzione permette anche di impostare i
- valori del campo \textit{type of service} (TOF, vedi
- sez.~\ref{sec:IP_intro}) per i pacchetti uscenti. Per impostare una priorità
+ valori del campo \textit{type of service} (noto come TOS, vedi
+ sez.~\ref{sec:IP_xxx}) 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}.
\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
può essere utilizzata soltanto con \func{getsockopt} e prende per
- \param{optval} un valore intero.
-
+ \param{optval} un valore intero.
\end{basedescript}
+\subsection{Le opzioni per il protocollo IPv4}
+\label{sec:sock_ipv4_options}
+
+Il secondo insieme di opzioni dei socket che tratteremo è quello relativo ai
+socket che usano il protocollo IPv4.\footnote{come per le precedenti opzioni
+ generiche una descrizione di esse è disponibile nella settima sezione delle
+ pagine di manuale, nel caso specifico la documentazione si può consultare
+ con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il
+livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste
+opzioni in tab.~\ref{tab:sock_opt_iplevel}.
+
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{IP\_OPTIONS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_PKTINFO}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_RECVTOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_RECVTTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_RECVOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_RETOPTS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_TOS}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_HDRINCL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_RECVERR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_MTU\_DISCOVER}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_MTU}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_ROUTER\_ALERT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_MULTICAST\_TTL}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_MULTICAST\_LOOP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_ADD\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_DROP\_MEMBERSHIP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \const{IP\_MULTICAST\_IF}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ .\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni disponibili al livello \const{SOL\_IP}.}
+ \label{tab:sock_opt_iplevel}
+\end{table}
+
+
+
\section{Altre funzioni di controllo}
Nella directory \texttt{/proc/sys/net/core} sono disponibili le opzioni
generiche dei socket, descritte anche nella rispettiva pagina di
-manuale.\foonote{quella accessibile con \texttt{man 7 socket}.} Queste sono:
+manuale.\footnote{quella accessibile con \texttt{man 7 socket}.} Queste sono:
\begin{basedescript}{\desclabelwidth{3cm}\desclabelstyle{\nextlinelabel}}
\item[\texttt{rmem\_default}] imposta la dimensione di default del buffer di