Completata e rivista la trattazione di SO_LINGER.
authorSimone Piccardi <piccardi@gnulinux.it>
Sat, 14 May 2005 23:55:25 +0000 (23:55 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sat, 14 May 2005 23:55:25 +0000 (23:55 +0000)
sockctrl.tex

index d65f7c4371728f9ec1fb75113ae003009f61d554..b0cc66c6b02f34a8a346a30865f74858a5742ca5 100644 (file)
@@ -2275,11 +2275,12 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \subsection{Le uso delle principali opzioni dei socket}
 \label{sec:sock_options_main}
 
-L'elenco sintetico delle caratteristiche delle opzioni dei socket riportato in
-sez.~\ref{sec:sock_generic_options} non è sufficientemente dettagliato per
-permetterci di approfondire il significato di alcune di esse, che assumono
-grande importanza nella programmazione dei socket. Per questo motivo
-tratteremo ulteriormente l'uso di alcune di esse in questa sezione.
+La descrizione sintetica del significato delle opzioni generiche dei socket,
+riportata nell'elenco in sez.~\ref{sec:sock_generic_options}, non è
+sufficientemente dettagliata per permetterci di approfondire tutti le
+funzionalità che alcune di esse possono controllare, alcune delle quali hanno
+un rilevanza notevole nella programmazione dei socket. Per questo motivo
+tratteremo nei dettagli le principali opzioni in questa sezione.
 
 
 \index{\texttt{SO\_KEEPALIVE} (costante)|(} 
@@ -2287,11 +2288,13 @@ tratteremo ulteriormente l'uso di alcune di esse in questa sezione.
 
 La prima opzione da approfondire è \const{SO\_KEEPALIVE} che permette di
 tenere sotto controllo lo stato di una connessione. Una connessione infatti
-resta attiva anche quando non viene effettuato alcun traffico su di essa, per
-cui un crollo della stessa potrebbe passare inosservato.
+resta attiva anche quando non viene effettuato alcun traffico su di essa,
+questo può comportare che un crollo della connessione, qualora avvenisse ad
+esempio in conseguenza di una interruzione completa della rete, potrebbe
+passare inosservato.
 
-Se si imposta questa opzione, è cura del kernel inviare degli appositi
-messaggi sulla rete (detti appunto \textit{keep-alive}) per verificare se la
+Se si imposta questa opzione, è invece cura del kernel inviare degli appositi
+messaggi sulla rete, detti appunto \textit{keep-alive}, per verificare se la
 connessione è attiva.  L'opzione funziona soltanto con socket che supportino
 le connessioni (non ha senso per socket UDP ad esempio) e si applica
 principalmente ai socket TCP.
@@ -2311,18 +2314,20 @@ il primo 
 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
+  FIN all'altro capo della connessione.} in questo caso all'invio del
+messaggio di \textit{keep-alive} si otterrà come risposta un segmento RST che
+indica che l'altro capo non riconosce più l'esistenza della connessione. 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 75
-secondi ad un massimo di 9 volte\footnote{entrambi questi valori possono
+secondi per un massimo di 9 volte\footnote{entrambi questi valori possono
   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 errore di
+  di kernel ed i suddetti 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 errore di
 \errcode{ETIMEDOUT}. Qualora la connessione si sia ristabilita e si riceva un
 successivo messaggio di risposta il ciclo riparte come se niente fosse
 avvenuto.  Infine se invece si riceve come risposta un pacchetto ICMP di
@@ -2330,14 +2335,14 @@ destinazione irraggiungibile (vedi sez.~\ref{sec:icmp_protocol_xxx}), verr
 restituito l'errore corrispondente.
 
 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
+connessione\footnote{la terminazione 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.} anche quando non si sta facendo
+traffico su di essa.  In genere viene usata sui server per evitare di
 mantenere impegnate le risorse dedicate a trattare delle connessioni in realtà
-terminate ad esempio perché l'altro capo è crollato senza che se ne sia
-ricevuto un avviso; quelle che vengono anche chiamate conessioni
-\textsl{semi-aperte}, in cui il server è in attesa di dati in ingresso che non
-arriveranno mai perché il client non è più attivo.
+già terminate (quelle che vengono anche chiamate connessioni
+\textsl{semi-aperte}) in cui il server è in attesa di dati in ingresso che non
+arriveranno mai perché il client sull'altro capo non è più attivo.
 
 Abilitandola le connessioni effettivamente terminate vengono chiuse e ad
 esempio una \func{select} potrà rilevare la conclusione delle stesse e
@@ -2356,7 +2361,7 @@ vari tentativi di ritrasmissione del \textit{keep-alive} (anche se questa non
   \normalsize
   \caption{La sezione della nuova versione del server del servizio
     \textit{echo} che prevede l'attivazione del \textit{keepalive} sui
-    socket.} 
+    socket.}
   \label{fig:echod_keepalive_code}
 \end{figure}
 
@@ -2582,19 +2587,20 @@ illustrata; questa combinazione viene utilizzata per riportarsi al
 comportamento normale qualora esso sia stato cambiato da una precedente
 chiamata.
 
-Se però si utilizza un valore di \var{l\_onoff} diverso da zero, il
-comportamento alla chiusura viene a dipendere dal valore specificato per il
-campo \var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni
-\func{close} e \func{shutdown} provoca la terminazione immediata della
-connessione: nel caso di TCP cioè non viene eseguito il procedimento di
-chiusura illustrato in sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora
-presenti nel buffer vengono immediatamente scartati e sulla rete viene inviato
-un segmento di RST che termina immediatamente la connessione.
+Se si utilizza un valore di \var{l\_onoff} diverso da zero, il comportamento
+alla chiusura viene a dipendere dal valore specificato per il campo
+\var{l\_linger}; se quest'ultimo è nullo l'uso delle funzioni \func{close} e
+\func{shutdown} provoca la terminazione immediata della connessione: nel caso
+di TCP cioè non viene eseguito il procedimento di chiusura illustrato in
+sez.~\ref{sec:TCP_conn_term}, ma tutti i dati ancora presenti nel buffer
+vengono immediatamente scartati e sulla rete viene inviato un segmento di RST
+che termina immediatamente la connessione.
 
 Un esempio di questo comportamento si può abilitare nel nostro client del
-servizio \textit{echo} utilizzando l'opzione \texttt{-r}, al solito riportiamo
-in fig.~\ref{fig:TCP_echo_sixth} solo la sezione di codice rilevante, il
-codice completo è disponibile nei sorgenti allegati.
+servizio \textit{echo} utilizzando l'opzione \texttt{-r}; riportiamo in
+fig.~\ref{fig:TCP_echo_sixth} la sezione di codice che permette di introdurre
+questa funzionalità,; al solito il codice completo è disponibile nei sorgenti
+allegati.
 
 \begin{figure}[!htb] 
   \footnotesize \centering
@@ -2607,31 +2613,33 @@ codice completo 
   \label{fig:TCP_echo_sixth}
 \end{figure}
 
-In questo caso la sezione indicata viene eseguita dopo aver effettuato la
-connessione e prima di chiamare la funzione di gestione, cioè fra le righe
-(\texttt{\small 12}) e (\texttt{\small 13}) del precedente esempio di
-fig.~\ref{fig:TCP_echo_fifth}. Il codice si limita semplicememente a
-controllare (\texttt{\small 3}) il valore della variabile \var{reset}
-(opportunamente impostata nella gestione delle opzioni qualora si usi
-\texttt{-r} nella chiamata del client) e nel caso impostare (\texttt{\small
-  5--6}) gli opportuni valori della struttura \var{ling}, per poi usare questa
-nella successiva (\texttt{\small 7}) chiamata a \func{setsockopt}. Di questa
-(\texttt{\small 7--10}) viene comunque controllato il valore di ritorno ed
-eseguita la terminazione del programma in caso un eventuale errore, con stampa
-dello stesso.
-
-Infine se sia \var{l\_onoff} che \var{l\_linger} hanno un valore diverso da
-zero sia \func{close} che \func{shutdown} si bloccano eseguendo la normale
-procedura di conclusione della connessione (quella di
-sez.~\ref{sec:TCP_conn_term}) e non ritornano fintanto che non si sia concluso
-il procedimento di chiusura della connessione, o non siano passati il numero
-di secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata
-  da Linux, altri kernel possono usare unità di misura diverse, oppure usare
-  il campo \var{l\_linger} come valore logico (ignorandone il valore) per
-  rendere (quando diverso da zero) \func{close} e \func{shutdown} bloccanti
-  fino al completamento della trasmissione dei dati sul buffer.}  specificati
-da \var{l\_linger}.
-
+La sezione indicata viene eseguita dopo aver effettuato la connessione e prima
+di chiamare la funzione di gestione, cioè fra le righe (\texttt{\small 12}) e
+(\texttt{\small 13}) del precedente esempio di fig.~\ref{fig:TCP_echo_fifth}.
+Il codice si limita semplicememente a controllare (\texttt{\small 3}) il
+valore della variabile \var{reset} che assegnata nella gestione delle opzioni
+in corrispondenza all'uso di \texttt{-r} nella chiamata del client. Nel caso
+questa sia diversa da zero vengono impostati (\texttt{\small 5--6}) i valori
+della struttura \var{ling} che permettono una terminazione immediata della
+connessine. Questa viene poi usata nella successiva (\texttt{\small 7})
+chiamata a \func{setsockopt}. Al solito si controlla (\texttt{\small 7--10})
+il valore di ritorno e si termina il programma in caso di errore, stampadone
+il valore.
+
+Infine l'ultima possibilità, quella in cui si utilizza effettivamente
+\const{SO\_LINGER} per \textsl{indugiare} nella chiusura, è quella in cui sia
+\var{l\_onoff} che \var{l\_linger} hanno un valore diverso da zero. Se si
+esegue l'impostazione con questi valori sia \func{close} che \func{shutdown}
+si bloccano, nel frattempo viene eseguita la normale procedura di conclusione
+della connessione (quella di sez.~\ref{sec:TCP_conn_term}) ma entrambe le
+funzioni ritornano fintanto che non si sia concluso il procedimento di
+chiusura della connessione, o non sia passato un numero di
+secondi\footnote{questa è l'unità di misura indicata da POSIX ed adottata da
+  Linux, altri kernel possono usare unità di misura diverse, oppure usare il
+  campo \var{l\_linger} come valore logico (ignorandone il valore) per rendere
+  (quando diverso da zero) \func{close} e \func{shutdown} bloccanti fino al
+  completamento della trasmissione dei dati sul buffer.}  pari al valore
+specificato in \var{l\_linger}.