Aggiornate le date nelle note di copyright
[gapil.git] / sockctrl.tex
index 1cd043457c240ac118d42b42224d3bbdcc0b8941..4bc3bc4d90e2ef92526840e4501814b8b0dc208e 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2005 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -2261,26 +2261,47 @@ allora il seguente:
   ma esistono ancora dei processi figli che mantengono attiva almeno una
   connessione remota che utilizza l'indirizzo locale; quando si riavvia il
   server questo viene bloccato sulla chiamata a \func{bind} dato che la porta
-  è ancora utilizzata in una connessione esistente.
-
-  Il punto più critico è che con il protocollo TCP questo può avvenire anche
-  dopo che l'ultimo processo figlio è terminato, in quanto la connessione può
-  restare attiva anche dopo la chiusura del socket mantenendosi nello stato
-  \texttt{TIME\_WAIT}. Usando \const{SO\_REUSEADDR} fra la chiamata a
-  \func{socket} e quella a \func{bind} si consente a quest'ultima di avere
-  successo anche in questo caso. È bene però ricordare che (si riveda quanto
-  detto in sez.~\ref{sec:TCP_time_wait}) la presenza dello stato
-  \texttt{TIME\_WAIT} ha una ragione, e che se si usa questa opzione esiste
-  sempre una probabilità, anche se estremamente remota,\footnote{perché ciò
-    avvenga infatti non solo devono coincidere gli indirizzi IP e le porte
-    degli estremi della nuova connessione, ma anche i numeri di sequenza dei
-    pacchetti, e questo è estremamente improbabile.}  che eventuali pacchetti
-  rimasti intrappolati in una precedente connessione possano finire fra quelli
-  di una nuova. 
-
-
-
-
+  è ancora utilizzata in una connessione esistente.\footnote{questa è una
+    delle domande più frequenti sui newsgroup dedicati allo sviluppo, in
+    quanto è piuttosto comune in questa situazione quando si sta sviluppando
+    un server che si ferma e si riavvia in continuazione.}  Inoltre se si usa
+  il protocollo TCP questo può avvenire anche dopo che l'ultimo processo
+  figlio è terminato, dato che la connessione può restare attiva anche dopo la
+  chiusura del socket mantenendosi nello stato \texttt{TIME\_WAIT}. 
+
+  Usando \const{SO\_REUSEADDR} fra la chiamata a \func{socket} e quella a
+  \func{bind} si consente a quest'ultima di avere comunque successo anche se
+  la connessione è attiva (o nello stato texttt{TIME\_WAIT}). È bene però
+  ricordare (si riveda quanto detto in sez.~\ref{sec:TCP_time_wait}) che la
+  presenza dello stato \texttt{TIME\_WAIT} ha una ragione, ed infatti se si
+  usa questa opzione esiste sempre una probabilità, anche se estremamente
+  remota,\footnote{perché ciò avvenga infatti non solo devono coincidere gli
+    indirizzi IP e le porte degli estremi della nuova connessione, ma anche i
+    numeri di sequenza dei pacchetti, e questo è estremamente improbabile.}
+  che eventuali pacchetti rimasti intrappolati in una precedente connessione
+  possano finire fra quelli di una nuova.
+
+  Il secondo caso in cui viene usata questa opzione è quando si ha una
+  macchina cui sono assegnati diversi numeri IP (o come suol dirsi
+  \textit{multi-homed}) e si vuole porre in ascolto sulla stessa porta un
+  programma diverso (o una istanza diversa dello stesso programma) per
+  indirizzi IP diversi. Si ricordi infatti che è sempre possibile indicare a
+  \func{bind} di collegarsi solo su di un indirizzo specifico; in tal caso se
+  un altro programma cerca di riutilizzare la stessa porta (anche specificando
+  un indirizzo diverso) otterrà un errore a meno di non aver preventivamente
+  impostato \const{SO\_REUSEADDR}. Usando questa opzione diventa anche
+  possibile eseguire \func{bind} sull'indirizzo generico, e questo permetterà
+  il collegamento per tutti gli indirizzi (di quelli presenti) per i quali la
+  porta risulti libera. Infine si tenga presente che con il protocollo TCP non
+  è mai possibile far partire server che eseguano \func{bind} sullo stesso
+  indirizzo e la stessa porta, cioè ottenere quello che viene chiamato un
+  \textit{completely duplicate binding}.
+
+  Il terzo impiego è simile al precedente e prevede l'uso di \func{bind}
+  all'interno dello stesso programma per associare indirizzi diversi a socket
+  diversi. Vale in questo caso quanto detto in precedenza, l'unica differenza
+  è che in questo caso le diverse chiamate a  \func{bind} sono eseguite
+  all'interno dello stesso programma.
 
 
 \item[\const{SO\_TYPE}] questa opzione permette di leggere il tipo di socket