X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=d49586f78cdceeecf95c6df3ce3bb84d533b8310;hp=1b8ee7b917a29f14d1befb29b3ab1513c877373d;hb=ca8f294a2c83d16e522cb0652de5827635fedc9b;hpb=b613eaf32bee556b7f2cd436fd37c89adfff8ca1 diff --git a/sockctrl.tex b/sockctrl.tex index 1b8ee7b..d49586f 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -2020,27 +2020,30 @@ quale si voglia far ascoltare il server. \label{sec:sock_options} Benché dal punto di vista del loro uso come canali di trasmissione di dati i -socket vengano trattati allo stesso modo dei file, siano acceduti tramite i -file descriptor, e gestiti con le ordinarie funzioni di lettura e scrittura -dei file, l'interfaccia standard usata per la gestione dei file generici non è -comunque sufficiente a poterne controllare tutte le caratteristiche -specifiche, considerato poi che queste variano a seconda del tipo di socket (e -della relativa forma di comunicazione sottostante). +socket vengano trattati allo stesso modo dei file, acceduti tramite i file +descriptor, e gestiti con le ordinarie funzioni di lettura e scrittura dei +file, l'interfaccia standard usata per la gestione dei file generici non è +comunque sufficiente a controllare la moltitudine di caratteristiche +specifiche che li contraddistinguono, considerato tra l'altro che queste +possono essere completamente diverse fra loro a seconda del tipo di socket e +della relativa forma di comunicazione sottostante. In questa sezione vedremo allora quali sono le funzioni dedicate alla gestione -delle caratteristiche specifiche dei vari tipi di socket, le cosiddette -\textit{socket options}, ma soprattutto analizzaremo quali sono queste opzioni -e quali caretteristiche e comportamenti dei socket permettono di controllare. +delle caratteristiche specifiche dei vari tipi di socket, che vengono +raggruppate sotto il nome generico di ``\textit{socket options}'', ma +soprattutto analizzaremo quali sono queste opzioni e quali caretteristiche e +comportamenti dei socket permettono di controllare. \subsection{Le funzioni di gestione delle opzioni dei socket} \label{sec:sock_setsockopt} -Le varie caratteristiche dei socket possono essere gestite attraverso l'uso di -due funzioni generiche che permettono rispettivamente di impostarle e di -recuperarne il valore corrente. La prima di queste due funzioni, quella usata -per impostare le \textit{socket options}, è \funcd{setsockopt}, ed il suo -prototipo è: +La modalità principale con cui si possono gestire le caratteristiche dei +socket (ne vedremo delle ulteriori nelle prossime sezioni) è quella che passa +attraverso l'uso di due funzioni di sistema generiche che permettono +rispettivamente di impostarle e di recuperarne il valore corrente. La prima di +queste due funzioni, quella usata per impostare le \textit{socket options}, è +\funcd{setsockopt}, ed il suo prototipo è: \begin{funcproto}{ \fhead{sys/socket.h} @@ -2084,22 +2087,6 @@ dal socket. Infine \param{level} prevede anche il valore speciale \const{SOL\_SOCKET} usato per le opzioni generiche che sono disponibili per qualunque tipo di socket. -I valori usati per \param{level}, corrispondenti ad un dato protocollo usato -da un socket, sono quelli corrispondenti al valore numerico che identifica il -suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un -programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici, -più comunemente si indica il protocollo tramite le apposite costanti -\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono -riassunti i valori che possono essere usati per l'argomento -\param{level}.\footnote{la notazione in questo caso è, purtroppo, abbastanza - confusa: infatti in Linux il valore si può impostare sia usando le costanti - \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*} (citate anche da - Stevens in \cite{UNP1}); entrambe hanno gli stessi valori che sono - equivalenti ai numeri di protocollo di \conffile{/etc/protocols}, con una - eccezione specifica, che è quella del protocollo ICMP, per la quale non - esista una costante, il che è comprensibile dato che il suo valore, 1, è - quello che viene assegnato a \const{SOL\_SOCKET}.} - \begin{table}[!htb] \centering \footnotesize @@ -2120,6 +2107,23 @@ riassunti i valori che possono essere usati per l'argomento \label{tab:sock_option_levels} \end{table} +I valori usati per \param{level}, corrispondenti ad un dato protocollo usato +da un socket, sono quelli corrispondenti al valore numerico che identifica il +suddetto protocollo in \conffile{/etc/protocols}; dato che la leggibilità di un +programma non trarrebbe certo beneficio dall'uso diretto dei valori numerici, +più comunemente si indica il protocollo tramite le apposite costanti +\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels}, dove si sono +riassunti i valori che possono essere usati per l'argomento +\param{level}. + +La notazione in questo caso è, purtroppo, abbastanza confusa: infatti in Linux +il valore si può impostare sia usando le costanti \texttt{SOL\_*}, che le +analoghe \texttt{IPPROTO\_*} (citate anche da Stevens in \cite{UNP1}); +entrambe hanno gli stessi valori che sono equivalenti ai numeri di protocollo +di \conffile{/etc/protocols}, con una eccezione specifica, che è quella del +protocollo ICMP, per la quale non esiste una costante, il che è comprensibile +dato che il suo valore, 1, è quello che viene assegnato a \const{SOL\_SOCKET}. + Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che contiene i dati che specificano il valore dell'opzione che si vuole passare al socket, mentre l'ultimo argomento \param{optlen},\footnote{questo argomento è @@ -2143,15 +2147,18 @@ di opzioni però usano dei tipi di dati peculiari, è questo il motivo per cui La seconda funzione usata per controllare le proprietà dei socket è \funcd{getsockopt}, che serve a leggere i valori delle opzioni dei socket ed a farsi restituire i dati relativi al loro funzionamento; il suo prototipo è: -\begin{functions} - \headdecl{sys/socket.h} - \headdecl{sys/types.h} - \funcdecl{int getsockopt(int s, int level, int optname, void *optval, - socklen\_t *optlen)} Legge le opzioni di un socket. - \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di - errore, nel qual caso \var{errno} assumerà i valori: +\begin{funcproto}{ +\fhead{sys/socket.h} +\fhead{sys/types.h} +\fdecl{int getsockopt(int s, int level, int optname, void *optval, + socklen\_t *optlen)} +\fdesc{Legge le opzioni di un socket.} +} + +{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual + caso \var{errno} assumerà uno dei valori: \begin{errlist} \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido. \item[\errcode{EFAULT}] l'indirizzo \param{optval} o quello di @@ -2162,7 +2169,7 @@ farsi restituire i dati relativi al loro funzionamento; il suo prototipo è: un socket. \end{errlist} } -\end{functions} +\end{funcproto} I primi tre argomenti sono identici ed hanno lo stesso significato di quelli di \func{setsockopt}, anche se non è detto che tutte le opzioni siano definite @@ -2199,48 +2206,62 @@ tab.~\ref{tab:sock_opt_socklevel}. \textbf{Descrizione}\\ \hline \hline + \const{SO\_ACCEPTCONN}&$\bullet$& & &\texttt{int}& + Indica se il socket è in ascolto.\\ + \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$& &\texttt{char *}& + Lega il socket ad un dispositivo.\\ + \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Attiva o disattiva il \textit{broadcast}.\\ + \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita la compatibilità con BSD.\\ + \const{SO\_DEBUG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita il debugging sul socket.\\ + \const{SO\_DOMAIN} &$\bullet$& & &\texttt{int}& + Legge il tipo di socket.\\ + \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Non invia attraverso un gateway.\\ + \const{SO\_ERROR} &$\bullet$& & &\texttt{int}& + Riceve e cancella gli errori pendenti.\\ \const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Controlla l'attività della connessione.\\ + \const{SO\_LINGER} &$\bullet$&$\bullet$& &\texttt{linger}& + Indugia nella chiusura con dati da spedire.\\ + \const{SO\_MARK} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta un ``\textit{firewall mark}'' sul socket.\\ \const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Lascia in linea i dati \textit{out-of-band}.\\ - \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Basso livello sul buffer di ricezione.\\ - \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& - Basso livello sul buffer di trasmissione.\\ - \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& - Timeout in ricezione.\\ - \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& - Timeout in trasmissione.\\ - \const{SO\_BSDCOMPAT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita la compatibilità con BSD.\\ \const{SO\_PASSCRED} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Abilita la ricezione di credenziali.\\ \const{SO\_PEERCRED} &$\bullet$& & &\texttt{ucred}& Restituisce le credenziali del processo remoto.\\ - \const{SO\_BINDTODEVICE}&$\bullet$&$\bullet$& &\texttt{char *}& - Lega il socket ad un dispositivo.\\ - \const{SO\_DEBUG} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Abilita il debugging sul socket.\\ + \const{SO\_PRIORITY} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta la priorità del socket.\\ + \const{SO\_PROTOCOL} &$\bullet$& & &\texttt{int}& + Ottiene il protocollo usato dal socket.\\ + \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& + Imposta dimensione del buffer di ricezione.\\ + \const{SO\_RCVBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di ricezione.\\ + \const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Basso livello sul buffer di ricezione.\\ + \const{SO\_RCVTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& + Timeout in ricezione.\\ \const{SO\_REUSEADDR}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& Consente il riutilizzo di un indirizzo locale.\\ - \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& - Restituisce il tipo di socket.\\ - \const{SO\_ACCEPTCONN}&$\bullet$& & &\texttt{int}& - Indica se il socket è in ascolto.\\ - \const{SO\_DONTROUTE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Non invia attraverso un gateway.\\ - \const{SO\_BROADCAST}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& - Attiva o disattiva il \textit{broadcast}.\\ + \const{SO\_REUSEPORT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Consente il riutilizzo di una porta.\\ \const{SO\_SNDBUF} &$\bullet$&$\bullet$& &\texttt{int}& Imposta dimensione del buffer di trasmissione.\\ - \const{SO\_RCVBUF} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta dimensione del buffer di ricezione.\\ - \const{SO\_LINGER} &$\bullet$&$\bullet$& &\texttt{linger}& - Indugia nella chiusura con dati da spedire.\\ - \const{SO\_PRIORITY} &$\bullet$&$\bullet$& &\texttt{int}& - Imposta la priorità del socket.\\ - \const{SO\_ERROR} &$\bullet$& & &\texttt{int}& - Riceve e cancella gli errori pendenti.\\ + \const{SO\_SNDBUFFORCE}&$\bullet$&$\bullet$& &\texttt{int}& + Forza dimensione del buffer di trasmissione.\\ + \const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}& + Basso livello sul buffer di trasmissione.\\ + \const{SO\_SNDTIMEO} &$\bullet$&$\bullet$& &\texttt{timeval}& + Timeout in trasmissione.\\ + \const{SO\_TIMESTAMP}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}& + Abilita/disabilita la ricezione dei \textit{timestamp}.\\ + \const{SO\_TYPE} &$\bullet$& & &\texttt{int}& + Restituisce il tipo di socket.\\ \hline \end{tabular} \caption{Le opzioni disponibili al livello \const{SOL\_SOCKET}.} @@ -2251,11 +2272,22 @@ tab.~\ref{tab:sock_opt_socklevel}. % vedi http://lwn.net/Articles/625224/ % TODO aggiungere e documentare SO_INCOMING_CPU, introdotta con il kernel 3.19, % vedi https://lwn.net/Articles/626150/ +% TODO documentare SO_PEEK_OFF +% TODO documentare SO_RXQ_OVFL +% TODO documentare SO_BUSYPOLL + + +% TODO documentare SO_MARK, cercare esempi e verificare il tipo di valore passato +% TODO documentare SO_PROTOCOL +% TODO documentare SO_REUSEPORT +% TODO documentare SO_TIMESTAMP +% TODO documentare SO_SNDBUFFORCE/SO_RCVBUFFORCE + 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 +disponibile, mentre la colonna successiva indica, quando si 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 @@ -2270,6 +2302,76 @@ soltanto un elenco più dettagliato della breve descrizione di tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}} +\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket + su cui opera è stato posto in modalità di ricezione di eventuali connessioni + con una chiamata a \func{listen}. L'opzione può essere usata soltanto con + \func{getsockopt} e utilizza per \param{optval} un intero in cui viene + restituito 1 se il socket è in ascolto e 0 altrimenti. + +\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il + socket ad una particolare 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}); utilizzando una stringa nulla o un valore nullo per + \param{optlen} si può rimuovere un precedente collegamento. + + Il nome della interfaccia deve essere specificato con una stringa terminata + da uno zero e di lunghezza massima pari a \constd{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{sec:socket_raw}). + +\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; + quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i + pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere + pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come + valore logico. L'opzione non ha effetti su un socket di tipo + \const{SOCK\_STREAM}. + +\item[\constd{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[\constd{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 \macrod{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 + \macrod{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[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei + pacchetti del socket, saltando ogni processo relativo all'uso della tabella + di routing del kernel. Prende per \param{optval} un intero usato come valore + logico. + +\item[\constd{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, nel quale viene restituito il codice di + errore, e la condizione di errore sul socket viene cancellata. Viene + usualmente utilizzata per ricevere il codice di errore, come accennato in + sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una + \func{select} che ritorna a causa dello stesso. + \item[\const{SO\_KEEPALIVE}] questa opzione abilita un meccanismo di verifica della persistenza di una connessione associata al socket (ed è pertanto effettiva solo sui socket che supportano le connessioni, ed è usata @@ -2277,6 +2379,15 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: usato come valore logico. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. +\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene + chiuso un socket quando si utilizza un protocollo che supporta le + connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e + modifica il comportamento delle funzioni \func{close} e \func{shutdown}. + L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo + \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in + fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento + sono forniti in sez.~\ref{sec:sock_options_main}. + \item[\constd{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 @@ -2286,6 +2397,30 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain + (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di + tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato + come valore logico. + +\item[\constd{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}. Utilizza per + \param{optval} una apposita struttura \struct{ucred} (vedi + sez.~\ref{sec:unix_socket}). + +\item[\constd{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,\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} (noto come TOS, vedi + sez.~\ref{sec:IP_header}) 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[\constd{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 @@ -2295,16 +2430,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: essere cambiato; \func{getsockopt} leggerà questo valore mentre \func{setsockopt} darà un errore di \errcode{ENOPROTOOPT}. -\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il - numero minimo di byte che devono essere presenti nel buffer di trasmissione - 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, come per la precedente \const{SO\_RCVLOWAT} 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[\constd{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}) @@ -2331,70 +2456,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: consente però di impostare il timeout per l'uso di \func{connect}, per avere il quale si può ricorrere a questa opzione. -% TODO verificare il timeout con un programma di test - -\item[\constd{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{sendto} e \func{sendmsg} - qualora queste restino bloccate per un tempo maggiore di quello specificato. - -\item[\constd{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[\constd{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain - (vedi sez.~\ref{sec:unix_socket}) la ricezione dei messaggi di controllo di - tipo \const{SCM\_CREDENTIALS}. Prende come \param{optval} un intero usato - come valore logico. - -\item[\constd{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}. Utilizza per - \param{optval} una apposita struttura \struct{ucred} (vedi - sez.~\ref{sec:unix_socket}). - -\item[\constd{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il - socket ad una particolare 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}); utilizzando una stringa nulla o un valore nullo per - \param{optlen} si può rimuovere un precedente collegamento. - - Il nome della interfaccia deve essere specificato con una stringa terminata - da uno zero e di lunghezza massima pari a \constd{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{sec:socket_raw}). - -\item[\constd{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 \macrod{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 - \macrod{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 da altri socket; l'opzione utilizza per \param{optval} un intero usato come valore logico. @@ -2405,28 +2466,24 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: socket. Maggiori dettagli sul suo funzionamento sono forniti in sez.~\ref{sec:sock_options_main}. -\item[\constd{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 intero in cui verrà restituito il valore numerico che lo - identifica (ad esempio \const{SOCK\_STREAM}). - -\item[\constd{SO\_ACCEPTCONN}] questa opzione permette di rilevare se il socket - su cui opera è stato posto in modalità di ricezione di eventuali connessioni - con una chiamata a \func{listen}. L'opzione può essere usata soltanto con - \func{getsockopt} e utilizza per \param{optval} un intero in cui viene - restituito 1 se il socket è in ascolto e 0 altrimenti. +\item[\constd{SO\_SNDLOWAT}] questa opzione imposta il valore che indica il + numero minimo di byte che devono essere presenti nel buffer di trasmissione + 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, come per la precedente \const{SO\_RCVLOWAT} 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[\constd{SO\_DONTROUTE}] questa opzione forza l'invio diretto dei - pacchetti del socket, saltando ogni processo relativo all'uso della tabella - di routing del kernel. Prende per \param{optval} un intero usato come valore - logico. +% TODO verificare il timeout con un programma di test -\item[\constd{SO\_BROADCAST}] questa opzione abilita il \textit{broadcast}; - quanto abilitata i socket di tipo \const{SOCK\_DGRAM} riceveranno i - pacchetti inviati all'indirizzo di \textit{broadcast}, e potranno scrivere - pacchetti su tale indirizzo. Prende per \param{optval} un intero usato come - valore logico. L'opzione non ha effetti su un socket di tipo - \const{SOCK\_STREAM}. +\item[\constd{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{sendto} e \func{sendmsg} + qualora queste restino bloccate per un tempo maggiore di quello specificato. \item[\constd{SO\_SNDBUF}] questa opzione imposta la dimensione del buffer di trasmissione del socket. Prende per \param{optval} un intero indicante il @@ -2459,36 +2516,6 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: essere effettive, devono essere impostate prima della chiamata alle funzioni \func{listen} o \func{connect}. -\item[\const{SO\_LINGER}] questa opzione controlla le modalità con cui viene - chiuso un socket quando si utilizza un protocollo che supporta le - connessioni (è pertanto usata con i socket TCP ed ignorata per UDP) e - modifica il comportamento delle funzioni \func{close} e \func{shutdown}. - L'opzione richiede che l'argomento \param{optval} sia una struttura di tipo - \struct{linger}, definita in \headfile{sys/socket.h} ed illustrata in - fig.~\ref{fig:sock_linger_struct}. Maggiori dettagli sul suo funzionamento - sono forniti in sez.~\ref{sec:sock_options_main}. - -\item[\constd{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,\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} (noto come TOS, vedi - sez.~\ref{sec:IP_header}) 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[\constd{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, nel quale viene restituito il codice di - errore, e la condizione di errore sul socket viene cancellata. Viene - usualmente utilizzata per ricevere il codice di errore, come accennato in - sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una - \func{select} che ritorna a causa dello stesso. - \item[\constd{SO\_ATTACH\_FILTER}] questa opzione permette di agganciare ad un socket un filtro di pacchetti che consente di selezionare quali pacchetti, fra tutti quelli ricevuti, verranno letti. Viene usato principalmente con i @@ -2496,6 +2523,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: implementare programmi di cattura dei pacchetti, torneremo su questo in sez.~\ref{sec:packet_socket}. +\item[\constd{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 intero in cui verrà restituito il valore numerico che lo + identifica (ad esempio \const{SOCK\_STREAM}). + + \item[\constd{SO\_DETACH\_FILTER}] consente di distaccare un filtro precedentemente aggiunto ad un socket.