\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
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
\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
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}}
\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
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 è:
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
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.}
\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,
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
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}
\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
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
\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
\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
\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}
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.
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.
approfondimento sul significato delle opzioni generiche più importanti.
-\index{\texttt{SO\_KEEPALIVE} (costante)|(}
+\index{costante!{\tt SO\_KEEPALIVE}|(}
\subsubsection{L'opzione \const{SO\_KEEPALIVE}}
La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
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!{\tt SO\_KEEPALIVE}|)}
-\index{\texttt{SO\_REUSEADDR} (costante)|(}
+\index{costante!{\tt SO\_REUSEADDR}|(}
\subsubsection{L'opzione \const{SO\_REUSEADDR}}
La seconda opzione da approfondire è \const{SO\_REUSEADDR}, che consente di
primo programma a consentirlo, avendo usato fin dall'inizio
\const{SO\_REUSEADDR}.}
-\index{\texttt{SO\_REUSEADDR} (costante)|)}
-
+\index{costante!{\tt SO\_REUSEADDR}|)}
-\index{\texttt{SO\_LINGER} (costante)|(}
+\index{costante!{\tt SO\_LINGER}|(}
\subsubsection{L'opzione \const{SO\_LINGER}}
La terza opzione da approfondire è \const{SO\_LINGER}; essa, come il nome
completamento della trasmissione dei dati sul buffer.} pari al valore
specificato in \var{l\_linger}.
-
-
-\index{\texttt{SO\_LINGER} (costante)|)}
+\index{costante!{\tt SO\_LINGER}|)}
\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
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}]