X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=585e3712e22092777a4b6d4420ef063be881524e;hp=88804386e2fa9daddd6a4d80a249308011330076;hb=6f8e0ca42d3d0b97b5e5747798a1eaffb44e8521;hpb=9a6d19e384fe9b1afbe4d9124ac34eaf7aa57562 diff --git a/sockctrl.tex b/sockctrl.tex index 8880438..585e371 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -34,7 +34,7 @@ porte o altre propriet \subsection{La struttura del \textit{resolver}} \label{sec:sock_resolver} -\index{\textit{resolver}|(} +\itindbeg{resolver} La risoluzione dei nomi è associata tradizionalmente al servizio del \textit{Domain Name Service} che permette di identificare le macchine su internet invece che per numero IP attraverso il relativo \textsl{nome a @@ -117,7 +117,7 @@ dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni funzioni di libreria, prevedendo un ordine di interrogazione predefinito e non modificabile (a meno di una ricompilazione delle librerie stesse).} -\index{\textit{Name~Service~Switch}|(} +\itindbeg{Name~Service~Switch} Per risolvere questa serie di problemi la risoluzione dei nomi a dominio eseguirà dal \textit{resolver} è stata inclusa all'interno di un meccanismo generico per la risoluzione di corrispondenze fra nomi ed informazioni ad essi @@ -168,7 +168,7 @@ tab.~\ref{tab:sys_NSS_classes}. \label{tab:sys_NSS_classes} \end{table} -Il sistema del \textit{Name Service Switch} è controllato dal contenuto del +Il sistema del \textit{Name Service Switch} è controllato dal contenuto del file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una convezione comune per i file di configurazione le righe vuote vengono ignorate e tutto quello che segue un carattere ``\texttt{\#}'' viene @@ -193,7 +193,7 @@ quello che conta sono le funzioni classiche che il \textit{resolver} mette a disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc} tenere conto della presenza del \textit{Name Service Switch}.} e sono queste quelle che tratteremo nelle sezioni successive. -\index{\textit{Name~Service~Switch}|)} +\itindend{Name~Service~Switch} \subsection{Le funzioni di interrogazione del \textit{resolver}} @@ -610,16 +610,15 @@ Restituisce una stringa corrispondente ad un errore di risoluzione. \noindent che, come l'analoga \func{strerror}, restituisce una stringa con un messaggio di errore già formattato, corrispondente al codice passato come argomento (che si presume sia dato da \var{h\_errno}). -\index{\textit{resolver}|)} - +\itindend{resolver} \subsection{La risoluzione dei nomi a dominio} \label{sec:sock_name_services} -La principale funzionalità del \index{\textit{resolver}}\textit{resolver} -resta quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci +La principale funzionalità del \itindex{resolver}\textit{resolver} resta +quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di una stazione noto il suo nome a dominio, il @@ -683,7 +682,7 @@ Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per -modificare le opzioni del \index{\textit{resolver}}\textit{resolver}; dato che +modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che questo non è molto comodo è stata definita\footnote{questa è una estensione fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.} un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è: @@ -720,10 +719,10 @@ suoi risultati. Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un programma che esegue una semplice interrogazione al -\index{\textit{resolver}}\textit{resolver} usando \func{gethostbyname} e poi -ne stampa a video i risultati. Al solito il sorgente completo, che comprende -il trattamento delle opzioni ed una funzione per stampare un messaggio di -aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida. +\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne +stampa a video i risultati. Al solito il sorgente completo, che comprende il +trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto, +è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida. Il programma richiede un solo argomento che specifichi il nome da cercare, senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che @@ -778,10 +777,10 @@ copiare il contenuto della sola struttura non i dati, in quanto questa contiene puntatori ad altri dati, che pure possono essere sovrascritti; per questo motivo, se si vuole salvare il risultato di una chiamata, occorrerà eseguire quella che si chiama una -\index{\textit{deep~copy}}\textit{deep copy}.\footnote{si chiama così quella - tecnica per cui, quando si deve copiare il contenuto di una struttura - complessa (con puntatori che puntano ad altri dati, che a loro volta possono - essere puntatori ad altri dati) si deve copiare non solo il contenuto della +\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica + per cui, quando si deve copiare il contenuto di una struttura complessa (con + puntatori che puntano ad altri dati, che a loro volta possono essere + puntatori ad altri dati) si deve copiare non solo il contenuto della struttura, ma eseguire una scansione per risolvere anche tutti i puntatori contenuti in essa (e così via se vi sono altre sottostrutture con altri puntatori) e copiare anche i dati da questi referenziati.} @@ -819,9 +818,9 @@ lunghezza di questo buffer devono essere indicati con gli argomenti \param{buf} e \param{buflen}. Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati -come \index{\textit{value~result~argument}}\textit{value result argument}, si -deve specificare l'indirizzo della variabile su cui la funzione dovrà salvare -il codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il +come \itindex{value~result~argument}\textit{value result argument}, si deve +specificare l'indirizzo della variabile su cui la funzione dovrà salvare il +codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il puntatore che si userà per accedere i dati con \param{result}. In caso di successo entrambe le funzioni restituiscono un valore nullo, @@ -883,17 +882,18 @@ usare la funzione \funcd{gethostbyaddr}, il cui prototipo In questo caso l'argomento \param{addr} dovrà essere il puntatore ad una appropriata struttura contenente il valore dell'indirizzo IP (o IPv6) che si -vuole risolvere. L'uso del tipo \type{char *} per questo argomento è storico, -il dato dovrà essere fornito in una struttura \struct{in\_addr}\footnote{si - ricordi che, come illustrato in fig.~\ref{fig:sock_sa_ipv4_struct}, questo - in realtà corrisponde ad un numero intero, da esprimere comunque in - \textit{network order}, non altrettanto avviene però per \var{in6\_addr}, - pertanto è sempre opportuno inizializzare questi indirizzi con - \func{inet\_pton} (vedi sez.~\ref{sec:sock_conv_func_gen}).} per un -indirizzo IPv4 ed una struttura \struct{in6\_addr} per un indirizzo IPv6, -mentre in \param{len} se ne dovrà specificare la dimensione (rispettivamente 4 -o 16), infine l'argomento \param{type} indica il tipo di indirizzo e dovrà -essere o \const{AF\_INET} o \const{AF\_INET6}. +vuole risolvere. L'uso del tipo \texttt{char *} per questo argomento è +storico, il dato dovrà essere fornito in una struttura +\struct{in\_addr}\footnote{si ricordi che, come illustrato in + fig.~\ref{fig:sock_sa_ipv4_struct}, questo in realtà corrisponde ad un + numero intero, da esprimere comunque in \textit{network order}, non + altrettanto avviene però per \struct{in6\_addr}, pertanto è sempre opportuno + inizializzare questi indirizzi con \func{inet\_pton} (vedi + sez.~\ref{sec:sock_conv_func_gen}).} per un indirizzo IPv4 ed una struttura +\struct{in6\_addr} per un indirizzo IPv6, mentre in \param{len} se ne dovrà +specificare la dimensione (rispettivamente 4 o 16), infine l'argomento +\param{type} indica il tipo di indirizzo e dovrà essere o \const{AF\_INET} o +\const{AF\_INET6}. La funzione restituisce, in caso di successo, un puntatore ad una struttura \struct{hostent}, solo che in questo caso la ricerca viene eseguita @@ -969,7 +969,7 @@ tab.~\ref{tab:sock_getipnodebyname_flags}. sistema è associata ad un indirizzo di tale tipo.\\ \const{AI\_DEFAULT} & il valore di default, è equivalente alla combinazione di \const{AI\_ADDRCONFIG} e di - \const{AI\_V4MAPPED)}.\\ + \const{AI\_V4MAPPED}.\\ \hline \end{tabular} \caption{Valori possibili per i bit dell'argomento \param{flags} della @@ -1173,9 +1173,9 @@ rimandando alle rispettive pagine di manuale. \textbf{Informazione}&\multicolumn{3}{|c|}{\textbf{Funzioni}}\\ \hline \hline - indirizzo&\func{sethostent}&\func{gethostent}&\func{endhostent} \\ - servizio &cd te\func{setservent}&\func{getservent}&\func{endservent}\\ - rete &\func{setnetent}&\func{getnetent}&\func{endnetent}\\ + indirizzo &\func{sethostent} &\func{gethostent} &\func{endhostent} \\ + servizio &\func{setservent} &\func{getservent} &\func{endservent}\\ + rete &\func{setnetent} &\func{getnetent} &\func{endnetent}\\ protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ \hline \end{tabular} @@ -1248,6 +1248,16 @@ ricerche generiche sugli indirizzi, usando sia IPv4 che IPv6, e richiedere risoluzioni sui nomi dei servizi indipendentemente dal protocollo (ad esempio TCP o UDP) che questi possono utilizzare. +Come ultimo argomento in \param{res} deve essere passato un puntatore ad una +variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che verrà +utilizzata dalla funzione per riportare (come \itindex{value~result~argument} +\textit{value result argument}) i propri risultati. La funzione infatti è +rientrante, ed alloca autonomamente tutta la memoria necessaria in cui +verranno riportati i risultati della risoluzione. La funzione scriverà +all'indirizzo puntato da \param{res} il puntatore iniziale ad una +\itindex{linked~list}\textit{linked list} di strutture di tipo +\struct{addrinfo} contenenti tutte le informazioni ottenute. + \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -1258,12 +1268,12 @@ TCP o UDP) che questi possono utilizzare. \label{fig:sock_addrinfo_struct} \end{figure} -La struttura \struct{addrinfo}, la cui definizione\footnote{la definizione è - ripresa direttamente dal file \texttt{netdb.h} in questa struttura viene - dichiarata, la pagina di manuale riporta \type{size\_t} come tipo di dato - per il campo \var{ai\_addrlen}, qui viene usata quanto previsto dallo - standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi di - dati sono comunque equivalenti.} è riportata in +Come illustrato la struttura \struct{addrinfo}, la cui definizione\footnote{la + definizione è ripresa direttamente dal file \texttt{netdb.h} in questa + struttura viene dichiarata, la pagina di manuale riporta \type{size\_t} come + tipo di dato per il campo \var{ai\_addrlen}, qui viene usata quanto previsto + dallo standard POSIX, in cui viene utilizzato \type{socklen\_t}; i due tipi + di dati sono comunque equivalenti.} è riportata in fig.~\ref{fig:sock_addrinfo_struct}, viene usata sia in ingresso, per passare dei valori di controllo alla funzione, che in uscita, per ricevere i risultati. Il primo campo, \var{ai\_flags}, è una maschera binaria di bit che @@ -1273,7 +1283,7 @@ che viene usato soltanto in ingresso. I tre campi successivi \var{ai\_family}, famiglia di indirizzi, il tipo di socket e il protocollo, in ingresso vengono usati per impostare una selezione (impostandone il valore nella struttura puntata da \param{hints}), mentre in uscita indicano il tipo di risultato -contenuto nella struttura. +contenuto nella struttura. Tutti i campi seguenti vengono usati soltanto in uscita; il campo \var{ai\_addrlen} indica la dimensione della struttura degli indirizzi @@ -1364,15 +1374,6 @@ bit della maschera. \label{tab:ai_flags_values} \end{table} -Come ultimo argomento di \func{getaddrinfo} deve essere passato un puntatore -ad una variabile (di tipo puntatore ad una struttura \struct{addrinfo}) che -verrà utilizzata dalla funzione per riportare (come \textit{value result - argument}) i propri risultati. La funzione infatti è rientrante, ed alloca -autonomamente tutta la memoria necessaria in cui verranno riportati i -risultati della risoluzione. La funzione scriverà in \param{res} il puntatore -iniziale ad una \index{\textit{linked~list}}\textit{linked list} di strutture -di tipo \struct{addrinfo} contenenti tutte le informazioni ottenute. - La funzione restituisce un valore nullo in caso di successo, o un codice in caso di errore. I valori usati come codice di errore sono riportati in tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre @@ -1414,7 +1415,7 @@ corrispondente \const{EAI\_SYSTEM} & c'è stato un errore di sistema, si può controllare \var{errno} per i dettagli. \\ % \hline -% estensioni GNU, trovarne la documentazione +% TODO estensioni GNU, trovarne la documentazione % \const{EAI\_INPROGRESS}& richiesta in corso. \\ % \const{EAI\_CANCELED}& la richiesta è stata cancellata.\\ % \const{EAI\_NOTCANCELED}& la richiesta non è stata cancellata. \\ @@ -1461,14 +1462,14 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}. \begin{figure}[!htb] \centering \includegraphics[width=10cm]{img/addrinfo_list} - \caption{La \index{\textit{linked~list}}\textit{linked list} delle strutture + \caption{La \itindex{linked~list}\textit{linked list} delle strutture \struct{addrinfo} restituite da \func{getaddrinfo}.} \label{fig:sock_addrinfo_list} \end{figure} Come primo esempio di uso di \func{getaddrinfo} vediamo un programma -elementare di interrogazione del \index{\textit{resolver}}\textit{resolver} -basato questa funzione, il cui corpo principale è riportato in +elementare di interrogazione del \itindex{resolver}\textit{resolver} basato +questa funzione, il cui corpo principale è riportato in fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa la gestione delle opzioni in cui è gestita l'eventuale inizializzazione dell'argomento \var{hints} per restringere le ricerche su protocolli, tipi di @@ -1558,11 +1559,10 @@ IPv4 address: \end{Verbatim} %$ -Una volta estratti i risultati dalla -\index{\textit{linked~list}}\textit{linked list} puntata da \param{res} se -questa non viene più utilizzata si dovrà avere cura di disallocare -opportunamente tutta la memoria, per questo viene fornita l'apposita funzione -\funcd{freeaddrinfo}, il cui prototipo è: +Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list} +puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura +di disallocare opportunamente tutta la memoria, per questo viene fornita +l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è: \begin{functions} \headdecl{netdb.h} @@ -1581,7 +1581,7 @@ per \param{res}. Si tenga presente infine che se si copiano i risultati da una delle strutture \struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre -avere cura di eseguire una \index{\textit{deep~copy}}\textit{deep copy} in cui +avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui si copiano anche tutti i dati presenti agli indirizzi contenuti nella struttura \struct{addrinfo}, perché una volta disallocati i dati con \func{freeaddrinfo} questi non sarebbero più disponibili. @@ -1979,11 +1979,12 @@ di \func{setsockopt}, anche se non per entrambe le funzioni. In questo caso \param{optval} viene usato per ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile -che viene usata come \textit{value result argument} per indicare, prima della -chiamata della funzione, la lunghezza del buffer allocato per \param{optval} e -per ricevere indietro, dopo la chiamata della funzione, la dimensione -effettiva dei dati scritti su di esso. Se la dimenzione del buffer allocato -per \param{optval} non è sufficiente si avrà un errore. +che viene usata come \itindex{value~result~argument}\textit{value result + argument} per indicare, prima della chiamata della funzione, la lunghezza +del buffer allocato per \param{optval} e per ricevere indietro, dopo la +chiamata della funzione, la dimensione effettiva dei dati scritti su di esso. +Se la dimenzione del buffer allocato per \param{optval} non è sufficiente si +avrà un errore. @@ -2136,7 +2137,7 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: consente però di impostare il timout per l'uso di \func{connect}, per avere il quale si può ricorrere a questa opzione. -% verificare con un programma di test +% TODO verificare il timeout con un programma di test \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 @@ -2184,21 +2185,21 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: \item[\const{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 \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 - \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 - 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}.} + di amministratore (in particolare con la \itindex{capabilities} + \textit{capability} \const{CAP\_NET\_ADMIN}). L'opzione necessita inoltre + dell'opportuno supporto nel kernel;\footnote{deve cioè essere definita la + macro di 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 \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 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; @@ -2264,7 +2265,8 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni: 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}. + privilegi di amministratore con la \itindex{capabilities} 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 @@ -2283,7 +2285,7 @@ programmazione dei socket. Per questo motivo faremo in questa sezione un approfondimento sul significato delle opzioni generiche più importanti. -\index{\texttt{SO\_KEEPALIVE} (costante)|(} +\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|(} \subsubsection{L'opzione \const{SO\_KEEPALIVE}} La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di @@ -2365,8 +2367,7 @@ presente per necessariamente ad una reale conclusione della connessione, il problema potrebbe anche 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} (anche se questa non è una una condizione molto -probabile). +\textit{keep-alive} (anche se questa non è una condizione molto probabile). Come esempio dell'utilizzo di questa opzione introduciamo all'interno del nostro server per il servizio \textit{echo} la nuova opzione \texttt{-k} che @@ -2385,10 +2386,11 @@ tutte le volte che un processo figlio viene eseguito in risposta ad una connessione verrà pertanto eseguita o meno la sezione (\texttt{\small 14--17}) che esegue l'impostazione di \const{SO\_KEEPALIVE} sul socket connesso, attivando il relativo comportamento. -\index{\texttt{SO\_KEEPALIVE} (costante)|)} +\index{costante!{SO\_KEEPALIVE}@{{\tt {SO\_KEEPALIVE}}}|)} -\index{\texttt{SO\_REUSEADDR} (costante)|(} + +\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|(} \subsubsection{L'opzione \const{SO\_REUSEADDR}} La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di @@ -2560,10 +2562,9 @@ questa opzione.\footnote{Questa restrizione permette di evitare il cosiddetto primo programma a consentirlo, avendo usato fin dall'inizio \const{SO\_REUSEADDR}.} -\index{\texttt{SO\_REUSEADDR} (costante)|)} - +\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)} -\index{\texttt{SO\_LINGER} (costante)|(} +\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|(} \subsubsection{L'opzione \const{SO\_LINGER}} La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome @@ -2649,9 +2650,7 @@ secondi\footnote{questa completamento della trasmissione dei dati sul buffer.} pari al valore specificato in \var{l\_linger}. - - -\index{\texttt{SO\_LINGER} (costante)|)} +\index{costante!{SO\_LINGER}@{{\tt {SO\_LINGER}}}|)} @@ -2838,8 +2837,10 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di \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 usante nella determinazione della \textit{Maximum - Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket. + o leggere le impostazioni usate nella determinazione della \textit{Maximum + Tranfer Unit} (vedi sez.~\ref{sec:net_lim_dim}) per il socket. Il valore + di default è determinato dal parametro \texttt{ip\_no\_pmtu\_disc} di + \func{sysctl}. \item[\const{IP\_MTU}] Permette di leggere il valore della \textit{Maximum Tranfer Unit} di percorso del socket. L'opzione richiede per @@ -2869,7 +2870,32 @@ ottenibile rispettivamente dai campi \var{ipi\_addr} e \var{ipi\_ifindex} di disponibili in locale l'uso di questa opzione permette di disabilitare questo tipo di traffico. -\item[\const{IP\_ADD\_MEMBERSHIP}] +\item[\const{IP\_ADD\_MEMBERSHIP}] L'opzione consente di unirsi ad gruppo di + 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 multicast a cui ci si vuole unire, con il campo \var{imr\_address} + l'indirizzo dell'interfaccia locale con cui unirsi al gruppo di 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 multicast.} + \label{fig:ip_mreqn_struct} +\end{figure} + + + \item[\const{IP\_DROP\_MEMBERSHIP}]