X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=sockctrl.tex;h=13384f354c979dbf0848dbbe8e54d5c2801575d4;hp=815ceb18e35a1e6f3bb62a6f1621003604a4a148;hb=b38fb9f5c8fb8360f7ac296baa8f4a0bdd692d1c;hpb=997a10619163980437d438ba7a4d8dda3fc56d98 diff --git a/sockctrl.tex b/sockctrl.tex index 815ceb1..13384f3 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, @@ -969,7 +968,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 @@ -1248,6 +1247,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 +1267,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 +1282,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 +1373,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 @@ -1461,14 +1461,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 +1558,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 +1580,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 +1978,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. @@ -2283,7 +2283,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!{\tt SO\_KEEPALIVE}|(} \subsubsection{L'opzione \const{SO\_KEEPALIVE}} La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di @@ -2385,10 +2385,10 @@ 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!{\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 @@ -2560,10 +2560,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!{\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 @@ -2649,9 +2648,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!{\tt SO\_LINGER}|)}