\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)|(}
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.
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
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
\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}
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
\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}.