Un typo segnalato da alessio
[gapil.git] / sockctrl.tex
index af35bcaef16ee548ebcefd799a9bb10d59433696..dbc5cd6df98868e2767a0d50e7758a7d7662dd8f 100644 (file)
@@ -34,6 +34,7 @@ porte o altre propriet
 \subsection{La struttura del \textit{resolver}}
 \label{sec:sock_resolver}
 
+\index{\textit{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
@@ -607,6 +608,7 @@ 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}|)}
 
 
 
@@ -614,11 +616,12 @@ argomento (che si presume sia dato da \var{h\_errno}).
 \subsection{La risoluzione dei nomi a dominio}
 \label{sec:sock_name_services}
 
-La principale funzionalità del \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 suo prototipo è:
+La principale funzionalità del \index{\textit{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
+suo prototipo è:
 \begin{prototype}{netdb.h}
 {struct hostent *gethostbyname(const char *name)}
 
@@ -678,10 +681,10 @@ 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 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 è:
+modificare le opzioni del \index{\textit{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 è:
 \begin{functions}
   \headdecl{netdb.h} 
   \headdecl{sys/socket.h}
@@ -714,11 +717,11 @@ 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 \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.
+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.
 
 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
@@ -1462,12 +1465,13 @@ lista illustrata in fig.~\ref{fig:sock_addrinfo_list}.
 \end{figure}
 
 Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del 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 socket o famiglie di indirizzi, è disponibile nel file
-\texttt{mygetaddr.c} dei sorgenti allegati alla guida.
+elementare di interrogazione del \index{\textit{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
+socket o famiglie di indirizzi, è disponibile nel file \texttt{mygetaddr.c}
+dei sorgenti allegati alla guida.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2087,13 +2091,13 @@ allora il seguente:
 
   In caso di problemi invece si possono avere i due casi già illustrati in
   sez.~\ref{sec:TCP_conn_crash} per il caso di terminazione prococe del
-  server: il primo è quello in cui la macchina remota non riconosce più la
-  connessione, ad esempio perché ha avuto un crollo ed è stata
-  riavviata,\footnote{si ricordi che un normale riavvio non ha questo effetto,
-    in quanto si passa per la chiusura del processo che invia un segmento FIN
-    all'altro capo della connessione.} per cui si otterrà come risposta un
-  RST. In tal caso il socket viene chiuso dopo aver impostato un errore
-  \errcode{ECONNRESET}.
+  server: il primo è quello in cui la macchina remota è caduta ed è stata
+  riavviata, per cui dopo il riavvio la connessione non viene più
+  riconosciuta,\footnote{si ricordi che un normale riavvio non ha questo
+    effetto, in quanto si passa per la chiusura del processo che chiude anche
+    il socket inviando un segmento FIN all'altro capo della connessione.} e si
+  otterrà come risposta un RST. In tal caso il socket viene chiuso dopo aver
+  impostato un errore \errcode{ECONNRESET}.
 
   Se invece non viene ricevuta nessuna risposta (indice che la macchina non è
   più raggiungibile) l'emissione dei messaggi viene ripetuta ad intervalli di
@@ -2101,25 +2105,24 @@ allora il seguente:
     essere opportunamente modificati con gli opportuni parametri illustrati in
     sez.~\ref{sec:sock_sysctl}, si tenga presente che però questo vale a
     livello di kernel ed i valori saranno applicati a \textsl{tutti} i
-    socket.} (per un totale di 11 minuti e 15 secondi) dopo di che se non si è
-  ricevuta nessuna risposta il socket viene chiuso dopo aver impostato un
+    socket.} (per un totale di 11 minuti e 15 secondi) dopo di che, se non si
+  è ricevuta nessuna risposta, il socket viene chiuso dopo aver impostato un
   errore di \errcode{ETIMEDOUT}. Se invece si riceve in risposta ad uno di
-  questi messaggi un pacchetto ICMP di destinazione irraggiungibile verrà
+  questi messaggi un pacchetto ICMP di destinazione irraggiungibile, verrà
   restituito l'errore corrispondente.
 
-  In generale questa opzione serve per individuare un crash della macchina
-  all'altro capo della connessione,\footnote{il crash di un processo di nuovo
-    comporta la chiusura di tutti i file che aveva aperti e la relativa
-    emissione degli opportuni segmenti FIN nel caso dei socket.} e viene usata
-  sui server per evitare di mantenere impegnate le risorse dedicate a trattare
-  delle connessioni in realtà terminate; abilitandola le connessioni
-  effettivamente terminate vengono chiuse ed una \func{select} potrà rilevare
-  la conclusione delle stesse e ricevere il relativo errore. Si tenga però
-  presente che non si ha la certezza assoluta che un errore di
-  \errcode{ETIMEDOUT} corrisponda ad una reale conclusione della connessione,
-  il problema potrebbe 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}.
+  In generale questa opzione serve per individuare una caduta della
+  connessione,\footnote{il crash di un processo di nuovo comporta la chiusura
+    di tutti i file che aveva aperti e la relativa emissione degli opportuni
+    segmenti FIN nel caso dei socket.} e viene usata sui server per evitare di
+  mantenere impegnate le risorse dedicate a trattare delle connessioni in
+  realtà terminate.  Abilitandola le connessioni effettivamente terminate
+  vengono chiuse ed una \func{select} potrà rilevare la conclusione delle
+  stesse e ricevere il relativo errore. Si tenga però presente che non si ha
+  la certezza assoluta che un errore di \errcode{ETIMEDOUT} corrisponda ad una
+  reale conclusione della connessione, il problema potrebbe 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}.
 
 
 
@@ -2189,14 +2192,14 @@ allora il seguente:
   state rimosse con il passaggio al 2.2; è consigliato correggere i programmi
   piuttosto che usare questa funzione.
 
-\item[\const{SO\_PASSCRED}] questa opzione abilita la ricezione dei messaggi
-  di controllo di tipo \const{SCM\_CREDENTIALS} dei socket unix-domain. Prende
-  per \param{optval} un intero usato come valore logico.
+\item[\const{SO\_PASSCRED}] questa opzione abilita sui socket unix-domain la
+  ricezione dei messaggi di controllo di tipo \const{SCM\_CREDENTIALS}. Prende
+  come \param{optval} un intero usato come valore logico.
 
 \item[\const{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}.  Prende come
-  valore per \param{optval} una apposita struttura \struct{ucred} (vedi
+  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_xxx}).
 
 \item[\const{SO\_BINDTODEVICE}] questa opzione permette di \textsl{legare} il
@@ -2229,25 +2232,50 @@ allora il seguente:
   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
+    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}]  
+\item[\const{SO\_REUSEADDR}] questa opzione permette di eseguire la funzione
+  \func{bind} su indirizzi locali che siano già in uso; l'opzione utilizza per
+  \param{optval} un intero usato come valore logico. 
+
+  Questa opzione modifica il comportamento normale dell'interfaccia dei socket
+  che fa fallire l'esecuzione della funzione \func{bind} con un errore di
+  \errcode{EADDRINUSE} quando l'indirizzo
+
+
 
 \item[\const{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 valore intero in cui verrà restituto il valore numerico
-  che lo identifica (ad esempio \const{SOCK\_STREAM}).
+  \param{optval} un intero in cui verrà restituto il valore numerico che lo
+  identifica (ad esempio \const{SOCK\_STREAM}).
+
+\item[\const{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[\const{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 come \param{optval} un intero usato come
+  valore logico. 
 
-\item[\const{SO\_ACCEPTCONN}]
-\item[\const{SO\_DONTROUTE}]
 \item[\const{SO\_BROADCAST}]
+
+
 \item[\const{SO\_SNDBUF}]
+
+
 \item[\const{SO\_RCVBUF}]  
+
+
 \item[\const{SO\_LINGER}]  
 \item[\const{SO\_PRIORITY}]
-\item[\const{SO\_ERROR}]
+
+\item[\const{SO\_ERROR}] 
+
 \end{basedescript}
 
 
@@ -2260,7 +2288,7 @@ Bench
 attraverso le due funzioni \func{setsockopt} e \func{getsockopt}, alcune
 funzionalità possono essere impostate attraverso quelle che sono le funzioni
 classiche per il controllo delle proprietà dei file, cioè \func{fcntl} e
-\func{ioctl}. 
+\func{ioctl}.
 
 
 \subsection{L'uso di \func{fcntl} per i socket}