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
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.
+ 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.
\item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
\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