d22c6aa84ab43a5696de32e2346915e11a11424c
[gapil.git] / tcpsockadv.tex
1  %% tcpsockadv.tex
2 %%
3 %% Copyright (C) 2003 Simone Piccardi.  Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
9 %% License".
10 %%
11 \chapter{Socket TCP avanzati}
12 \label{cha:TCP_advanced}
13
14 Esamineremo in questo capitolo le funzionalità più evolute della gestione dei
15 socket TCP, come l'uso del I/O multiplexing (trattato in
16 \secref{sec:file_multiplexing}) con i socket, l'uso delle opzioni dei socket e
17 la gestione dei dati urgenti e \textit{out-of-band}.
18
19
20
21 \section{Socket I/O multiplexing}
22 \label{sec:TCP_sock_multiplexing}
23
24 Affronteremo in questa sezione l'utilizzo dell'I/O multiplexing, affrontato in
25 \secref{sec:file_multiplexing}, nell'ambito delle applicazioni di rete. Già in
26 \secref{sec:TCP_server_crash} era emerso il problema relativo al client del
27 servizio echo che non era in grado di accorgersi della terminazione precoce
28 del server, essendo bloccato nella lettura dei dati immessi da tastiera.
29
30 Abbiamo visto in \secref{sec:file_multiplexing} quali sono le funzionalità del
31 sistema che ci permettono di tenere sotto controllo più file descriptor in
32 contemporanea; in quella occasione non abbiamo fatto esempi, in quanto quando
33 si tratta con file normali questa tipologia di I/O normalmente non viene
34 usata, è invece un caso tipico delle applicazioni di rete quello di dover
35 gestire varie connessioni da cui possono arrivare dati comuni in maniera
36 asincrona, per cui riprenderemo l'argomento in questa sezione.
37
38
39 \subsection{Il comportamento della funzione \func{select} con i socket.}
40 \label{sec:TCP_sock_select}
41
42 Iniziamo con la prima delle funzioni usate per l'I/O multiplexing,
43 \func{select}; il suo funzionamento è già stato descritto in dettaglio in
44 \secref{sec:file_multiplexing} e non staremo a ripetere quanto detto lì; 
45 sappiamo che la funzione ritorna quando uno o più dei file descriptor messi
46 sotto controllo è pronto per la relativa operazione.
47
48 In quell'occasione non abbiamo però definito cosa si intende per pronto,
49 infatti per dei normali file, o anche per delle pipe, la condizione di essere
50 pronti per la lettura o la scrittura è ovvia; invece lo è molto meno nel caso
51 dei socket, visto che possono intervenire tutte una serie di possibili
52 condizioni di errore dovute alla rete. Occorre allora specificare chiaramente
53 quali sono le condizioni per cui un socket risulta essere ``\textsl{pronto}''
54 quando viene passato come membro di uno dei tre \textit{file descriptor set}
55 usati da \func{select}.
56
57 Le condizioni che fanno si che la funzione \func{select} ritorni segnalando
58 che un socket (che sarà riportato nel primo insieme di file descriptor) è
59 pronto per la lettura sono le seguenti:
60 \begin{itemize*}
61 \item nel buffer di ricezione del socket sono arrivati dei dati in quantità
62   sufficiente a superare il valore di una \textsl{soglia di basso livello} (il
63   cosiddetto \textit{low watermark}). Questo valore è espresso in numero di
64   byte e può essere impostato con l'opzione del socket \const{SO\_RCVLOWAT}
65   (tratteremo le opzioni dei socket in \secref{sec:TCP_sock_options}); il suo
66   valore di default è 1 per i socket TCP e UDP. In questo caso una operazione
67   di lettura avrà successo e leggerà un numero di byte maggiore di zero.
68 \item il lato in lettura della connessione è stato chiuso; si è cioè ricevuto
69   un segmento FIN (si ricordi quanto illustrato in \secref{sec:TCP_conn_term})
70   sulla connessione. In questo caso una operazione di lettura avrà successo,
71   ma non risulteranno presenti dati (in sostanza \func{read} ritornerà con un
72   valore nullo) per indicare la condizione di end-of-file.
73 \item c'è stato un errore sul socket. In questo caso una operazione di lettura
74   non si bloccherà ma restituirà una condizione di errore (ad esempio
75   \func{read} restituirà -1) e imposterà la variabile \var{errno} al relativo
76   valore. Vedremo in \secref{sec:TCP_sock_options} come sia possibile estrarre
77   e cancellare errori pendenti su un socket usando l'opzione
78   \const{SO\_ERROR}.
79 \item quando si sta utilizzando un \textit{listening socket} ed ci sono delle
80   connessioni completate. In questo caso la funzione \func{accept} non si
81   bloccherà.\footnote{in realtà questo non è sempre vero, come accennato in
82     \secref{sec:TCP_conn_early_abort} una connessione può essere abortita
83     dalla ricezione di un segmento RST una volta che è stata completata,
84     allora se questo avviene dopo che \func{select} è ritornata, ma prima
85     della chiamata ad \func{accept}, quest'ultima, in assenza di altre
86     connessioni, potrà bloccarsi.}
87 \end{itemize*}
88
89 Le condizioni che fanno si che la funzione \func{select} ritorni segnalando
90 che un socket (che sarà riportato nel secondo insieme di file descriptor) è
91 pronto per la scrittura sono le seguenti:
92 \begin{itemize*}
93 \item nel buffer di invio è disponibile una quantità di spazio superiore al
94   valore della \textsl{soglia di basso livello} in scrittura ed inoltre o il
95   socket è già connesso o non necessita (ad esempio è UDP) di connessione.  Il
96   valore della soglia è espresso in numero di byte e può essere impostato con
97   l'opzione del socket \const{SO\_SNDLOWAT}; il suo valore di default è 2048
98   per i socket TCP e UDP. In questo caso una operazione di scrittura non si
99   bloccherà e restituirà un valore positivo pari al numero di byte accettati
100   dal livello di trasporto.
101 \item il lato in scrittura della connessione è stato chiuso. In questo caso
102   una operazione di scrittura sul socket genererà il segnale \const{SIGPIPE}.
103 \item c'è stato un errore sul socket. In questo caso una operazione di
104   scrittura non si bloccherà ma restituirà una condizione di errore ed
105   imposterà opportunamente la variabile \var{errno}. Vedremo in
106   \secref{sec:TCP_sock_options} come sia possibile estrarre e cancellare
107   errori pendenti su un socket usando l'opzione \const{SO\_ERROR}.
108 \end{itemize*}
109
110 Infine c'è una sola condizione che fa si che \func{select} ritorni segnalando
111 che un socket (che sarà riportato nel terzo insieme di file descriptor) ha una
112 condizione di eccezione pendente, e cioè la ricezione sul socket di dati
113 \textsl{fuori banda} (o \textit{out-of-band}), una caratteristica specifica
114 dei socket TCP su cui torneremo in \secref{sec:TCP_urgent_data}.
115
116 Si noti come nel caso della lettura \func{select} si applichi anche ad
117 operazioni che non hanno nulla a che fare con l'I/O di dati come il
118 riconoscimento della presenza di connessioni pronte, in modo da consentire
119 anche l'utilizzo di \func{accept} in modalità non bloccante. Si noti infine
120 come in caso di errore un socket venga sempre riportato come pronto sia per la
121 lettura che per la scrittura.
122
123 Lo scopo dei due valori di soglia per i buffer di ricezione e di invio è
124 quello di consentire maggiore flessibilità nell'uso di \func{select} da parte
125 dei programmi, se infatti si sa che una applicazione non è in grado di fare
126 niente fintanto che non può ricevere o inviare una certa quantità di dati, si
127 possono utilizzare questi valori per far si che \func{select} ritorni solo
128 quando c'è la certezza di avere dati a sufficienza.\footnote{questo tipo di
129   controllo è utile di norma solo per la lettura, in quanto in genere le
130   operazioni di scrittura sono già controllate dall'applicazione, che sà
131   sempre quanti dati invia, mentre non è detto possa conoscere la quantità di
132   dati in ricezione; per cui, nella situazione in cui si conosce almeno un
133   valore minimo, per evitare la penalizzazione dovuta alla ripetizione delle
134   operazioni di lettura per accumulare dati sufficienti, si può lasciare al
135   kernel il compito di impostare un minimo al di sotto del quale il file
136   descriptor, pur avendo disponibili dei dati, non viene dato per pronto in
137   lettura.}
138
139
140
141 \subsection{Un esempio di I/O multiplexing}
142 \label{sec:TCP_multiplex_example}
143
144 Abbiamo incontrato la problematica tipica che conduce all'uso dell'I/O
145 multiplexing nella nostra analisi degli errori in
146 \secref{sec:TCP_conn_early_abort}, quando il nostro client non era in grado di
147 rendersi conto di errori sulla connessione essendo impegnato nella attesa di
148 dati in ingresso dallo standard input.
149
150 In questo caso il problema è quello di dover tenere sotto controllo due
151 diversi file descriptor, lo standard input, da cui viene letto il testo che
152 vogliamo inviare al server, e il socket connesso con il server su cui detto
153 testo sarà scritto e dal quale poi si vorrà ricevere la risposta. L'uso
154 dell'I/O multiplexing consente di tenere sotto controllo entrambi, senza
155 restare bloccati.
156
157 Nel nostro caso quello che ci interessa è non essere bloccati in lettura sullo
158 standard input in caso di errori sulla connessione o chiusura della stessa da
159 parte del server. Entrambi questi casi possono essere rilevati usando
160 \func{select}, per quanto detto in \secref{sec:TCP_sock_select}, mettendo
161 sotto osservazione i file descriptor per la condizione di essere pronti in
162 lettura: sia infatti che si ricevano dati, che la connessione sia chiusa
163 regolarmente (con la ricezione di un segmento FIN) che si riceva una
164 condizione di errore (con un segmento RST) il socket connesso sarà pronto in
165 lettura (nell'ultimo caso anche in scrittura, ma questo non è necessario ai
166 nostri scopi).
167
168 \begin{figure}[!htb]
169   \footnotesize \centering
170   \begin{minipage}[c]{15.6cm}
171     \includecodesample{listati/ClientEcho_third.c}
172   \end{minipage} 
173   \normalsize
174   \caption{La sezione nel codice della terza versione della funzione
175     \func{ClientEcho} usata dal client per il servizio \textit{echo}
176     modificata per l'uso di \func{select}.}
177   \label{fig:TCP_ClientEcho_third}
178 \end{figure}
179
180 Riprendiamo allora il codice del client, modificandolo per l'uso di
181 \func{select}. Quello che dobbiamo modificare è la funzione \func{ClientEcho}
182 di \figref{fig:TCP_ClientEcho_second}, dato che tutto il resto, che riguarda
183 le modalità in cui viene stabilita la connessione con il server, resta
184 assolutamente identico. La nostra nuova versione di \func{ClientEcho}, la
185 terza della serie, è riportata in \figref{fig:TCP_ClientEcho_third}, il codice
186 completo si trova nel file \file{TCP\_echo\_third.c} dei sorgenti allegati alla
187 guida.
188
189 In questo caso la funzione comincia (\texttt{\small 8--9}) con l'azzeramento
190 del file descriptor set \var{fset} e l'impostazione del valore \var{maxfd}, da
191 passare a \func{select} come massimo per il numero di file descriptor. Per
192 determinare quest'ultimo si usa la macro \code{max} definita nel nostro file
193 \file{macro.h} che raccoglie una collezione di macro di preprocessore di varia
194 utilità.
195
196 La funzione prosegue poi (\texttt{\small 10--41}) con il ciclo principale, che
197 viene ripetuto indefinitamente. Per ogni ciclo si reinizializza
198 (\texttt{\small 11--12}) il file descriptor set, impostando i valori per il
199 file descriptor associato al socket \var{socket} e per lo standard input (il
200 cui valore si recupera con la funzione \func{fileno}). Questo è necessario in
201 quanto la successiva (\texttt{\small 13}) chiamata a \func{select} comporta
202 una modifica dei due bit relativi, che quindi devono essere reimpostati
203 all'inizio di ogni ciclo.
204
205 Si noti come la chiamata a \func{select} venga eseguita usando come primo
206 argomento il valore di \var{maxfd}, precedentemente calcolato, e passando poi
207 il solo file descriptor set per il controllo dell'attività in lettura, negli
208 altri argomenti sono passati tutti puntatori nulli, non interessando né il
209 controllo delle altre attività, né l'impostazione di un valore di timeout.
210
211 Al ritorno di \func{select} si provvede a controllare quale dei due file
212 descriptor presenta attività in lettura, cominciando (\texttt{\small 14--24})
213 con il file descriptor associato allo standard input. In caso di attività
214 (quando cioè \macro{FD\_ISSET} ritorna una valore diverso da zero) si esegue
215 (\texttt{\small 15}) una \func{fgets} per leggere gli eventuali dati presenti;
216 se non ve ne sono (e la funzione restituisce pertanto un puntatore nullo) si
217 ritorna immediatamente (\texttt{\small 16}) dato che questo significa che si è
218 chiuso lo standard input e quindi concluso l'utilizzo del client; altrimenti
219 (\texttt{\small 18--22}) si scrivono i dati appena letti sul socket,
220 prevedendo una uscita immediata in caso di errore di scrittura.
221
222 Controllato lo standard input si passa a controllare (\texttt{\small 25--40})
223 il socket connesso, in caso di attività (\texttt{\small 26}) si esegue subito
224 una \func{read} di cui si controlla il valore di ritorno; se questo è negativo
225 (\texttt{\small 27--30}) si è avuto un errore e pertanto si esce
226 immediatamente segnalandolo, se è nullo (\texttt{\small 31--34}) significa che
227 il server ha chiuso la connessione, e di nuovo si esce con stampando prima un
228 messaggio di avviso, altrimenti (\texttt{\small 35--39}) si effettua la
229 terminazione della stringa e la si stampa a sullo standard output (uscendo in
230 caso di errore), per ripetere il ciclo da capo.
231
232 Con questo meccanismo il programma invece di essere bloccato in lettura sullo
233 standard input resta bloccato sulla \func{select}, che ritorna soltanto quando
234 viene rilevata attività su uno dei due file descriptor posti sotto controllo.
235 Questo di norma avviene solo quando si è scritto qualcosa sullo standard
236 input, o quando si riceve dal socket la risposta a quanto si era appena
237 scritto. Ma adesso il client diventa capace di accorgersi immediatamente della
238 terminazione del server; in tal caso infatti il server chiuderà il socket
239 connesso, ed alla ricezione del FIN la funzione \func{select} ritornerà (come
240 illustrato in \secref{sec:TCP_sock_select}) segnalando una condizione di end
241 of file, per cui il nostro client potrà uscire immediatamente.
242
243 Riprendiamo la situazione affrontata in \secref{sec:TCP_server_crash},
244 terminando il server durante una connessione, in questo caso quello che
245 otterremo, una volta scritta una prima riga ed interrotto il server con un
246 \texttt{C-c}, sarà:
247 \begin{verbatim}
248 [piccardi@gont sources]$ ./echo 192.168.1.1
249 Prima riga
250 Prima riga
251 EOF sul socket
252 \end{verbatim}%$
253 dove l'ultima riga compare immediatamente dopo aver interrotto il server. Il
254 nostro client infatti è in grado di accorgersi immediatamente che il socket
255 connesso è stato chiuso ed uscire immediatamente.
256
257 Veniamo allora agli altri scenari di terminazione anomala visti in
258 \secref{sec:TCP_conn_crash}. Il primo di questi è l'interruzione fisica della
259 connessione; in questo caso avremo un comportamento analogo al precedente, in
260 cui si scrive una riga e non si riceve risposta dal server e non succede
261 niente fino a quando non si riceve un errore di \errcode{EHOSTUNREACH} o
262 \errcode{ETIMEDOUT} a seconda dei casi.
263
264 La differenza è che stavolta potremo scrivere più righe dopo l'interruzione,
265 in quanto il nostro client dopo aver inviato i dati non si bloccherà più nella
266 lettura dal socket, ma nella \func{select}; per questo potrà accettare
267 ulteriore dati che scriverà di nuovo sul socket, fintanto che c'è spazio sul
268 buffer di uscita (ecceduto il quale si bloccherà in scrittura). Si ricordi
269 infatti che il client non ha modo di determinare se la connessione è attiva o
270 meno (dato che in molte situazioni reali l'inattività può essere temporanea).
271 Tra l'altro se si ricollega la rete prima della scadenza del timeout, potremo
272 anche verificare come tutto quello che si era scritto viene poi effettivamente
273 trasmesso non appena la connessione ridiventa attiva, per cui otterremo
274 qualcosa del tipo:
275 \begin{verbatim}
276 [piccardi@gont sources]$ ./echo 192.168.1.1
277 Prima riga
278 Prima riga
279 Seconda riga dopo l'interruzione
280 Terza riga
281 Quarta riga
282 Seconda riga dopo l'interruzione
283 Terza riga
284 Quarta riga
285 \end{verbatim}
286 in cui, una volta riconnessa la rete, tutto quello che abbiamo scritto durante
287 il periodo di disconnessione restituito indietro e stampato immediatamente.
288
289 Lo stesso comportamento visto in \secref{sec:TCP_server_crash} si riottiene
290 nel caso di un crollo completo della macchina su cui sta il server. In questo
291 caso di nuovo il client non è in grado di accorgersi di niente dato che si
292 suppone che il programma server non venga terminato correttamente, ma si
293 blocchi tutto senza la possibilità di avere l'emissione di un segmento FIN che
294 segnala la terminazione della connessione. Di nuovo fintanto che la
295 connessione non si riattiva )con il riavvio della macchina del server) il
296 client non è in grado di fare altro che accettare dell'input e tentare di
297 inviarlo. La differenza in questo caso è che non appena la connessione
298 ridiventa attiva i dati verranno sì trasmessi, ma essendo state perse tutte le
299 informazioni relative alle precedenti connessioni ai tentativi di scrittura
300 del client sarà risposto con un segmento RST che provocherà il ritorno di
301 \func{select} per la ricezione di un errore di \errcode{ECONNRESET}.
302
303
304 \subsection{La funzione \func{shutdown}}
305 \label{sec:TCP_shutdown}
306
307 Come spiegato in \secref{sec:TCP_conn_term} il procedimento di chiusura di un
308 socket TCP prevede che da entrambe le parti venga emesso un segmento FIN. È
309 pertanto del tutto normale dal punto di vista del protocollo che uno dei due
310 capi chiuda la connessione, quando l'altro capo la lascia
311 aperta.\footnote{abbiamo incontrato questa situazione nei vari scenari critici
312   di \secref{sec:TCP_echo_critical}.}
313
314 È pertanto possibile avere una situazione in cui un capo della connessione non
315 avendo più nulla da scrivere, possa chiudere il socket, segnalando così
316 l'avvenuta terminazione della trasmissione (l'altro capo riceverà infatti un
317 end-of-file in lettura) mentre dall'altra parte si potrà proseguire la
318 trasmissione dei dati scrivendo sul socket che da quel lato è ancora aperto.
319 Questa è quella situazione in cui si dice che il socket è \textit{half
320   closed}.
321
322 Il problema che si pone è che se la chiusura del socket è effettuata con la
323 funzione \func{close}, come spiegato in \secref{sec:TCP_func_close}, si perde
324 ogni possibilità di poter rileggere quanto l'altro capo può continuare a
325 scrivere. Per poter permettere allora di segnalare che si è concluso con la
326 scrittura, continuando al contempo a leggere quanto può provenire dall'altro
327 capo del socket si può allora usare la funzione \funcd{shutdown}, il cui
328 prototipo è:
329 \begin{prototype}{sys/socket.h}
330 {int shutdown(int sockfd, int how)}
331
332 Chiude un lato della connessione fra due socket.
333   
334   \bodydesc{La funzione restituisce zero in caso di successo e -1 per un
335     errore, nel qual caso \var{errno} assumerà i valori:
336   \begin{errlist}
337   \item[\errcode{ENOTSOCK}] il file descriptor non corrisponde a un socket.
338   \item[\errcode{ENOTCONN}] il socket non è connesso.
339   \end{errlist}
340   ed inoltre \errval{EBADF}.}
341 \end{prototype}
342
343 La funzione prende come primo argomento il socket \param{sockfd} su cui si
344 vuole operare e come secondo argomento un valore intero \param{how} che indica
345 la modalità di chiusura del socket, quest'ultima può prendere soltanto tre
346 valori: 
347 \begin{basedescript}{\desclabelwidth{2.2cm}\desclabelstyle{\nextlinelabel}}
348 \item[\macro{SHUT\_RD}] chiude il lato in lettura del socket, non sarà più
349   possibile leggere dati da esso, tutti gli eventuali dati trasmessi
350   dall'altro capo del socket saranno automaticamente scartati dal kernel, che,
351   in caso di socket TCP, provvederà comunque ad inviare i relativi segmenti di
352   ACK.
353 \item[\macro{SHUT\_WR}] chiude il lato in scrittura del socket, non sarà più
354   possibile scrivere dati su di esso. Nel caso di socket TCP la chiamata causa
355   l'emissione di un segmento FIN, secondo la procedura chiamata
356   \textit{half-close}. Tutti i dati presenti nel buffer di scrittura prima
357   della chiamata saranno inviati, seguiti dalla sequenza di chiusura
358   illustrata in \secref{sec:TCP_conn_term}.
359 \item[\macro{SHUT\_RDWR}] chiude sia il lato in lettura che quello in
360   scrittura del socket. È equivalente alla chiamata in sequenza con
361   \macro{SHUT\_RD} e \macro{SHUT\_WR}.
362 \end{basedescript}
363
364 Ci si può chiedere quale sia l'utilità di avere introdotto \macro{SHUT\_RDWR}
365 quando questa sembra rendere \funcd{shutdown} del tutto equivalente ad una
366 \func{close}. In realtà non è così, esiste infatti un'altra differenza con
367 \func{close}, più sottile. Finora infatti non ci siamo presi la briga di
368 sottolineare in maniera esplicita che come per i file e le fifo, anche per i
369 socket possono esserci più riferimenti contemporanei ad uno stesso socket. Per
370 cui si avrebbe potuto avere l'impressione che sia una corrispondenza univoca
371 fra un socket ed il file descriptor con cui vi si accede. Questo non è
372 assolutamente vero, (e lo abbiamo già visto nel codice del server di
373 \figref{fig:TCP_echo_server_first_code}), ed è invece assolutamente normale
374 che, come per gli altri oggetti, ci possano essere più file descriptor che
375 fanno riferimento allo stesso socket.
376
377 Allora se avviene uno di questi casi quello che succederà è che la chiamata a
378 \func{close} darà effettivamente avvio alla sequenza di chiusura di un socket
379 soltanto quando il numero di riferimenti a quest'ultimo diventerà nullo.
380 Fintanto che ci sono file descriptor che fanno riferimento ad un socket
381 \func{close} si limiterà a deallocare nel processo corrente il file descriptor
382 utilizzato, ma il socket resterà pienamente accessibile attraverso gli altri
383 riferimenti.Se torniamo all'esempio di \figref{fig:TCP_echo_server_first_code}
384 abbiamo infatti che le due \func{close} (sul socket connesso nel padre e sul
385 socket in ascolto nel figlio), restando comunque altri riferimenti attivi (al
386 socket connesso nel figlio e a quello in ascolto nel padre) non effettuano
387 nessuna chiusura effettiva.  
388
389 Questo non avviene affatto se si usa \func{shutdown} al posto di \func{close},
390 in questo caso infatti la chiusura del socket viene effettuata immediatamente,
391 indipendentemente dalla presenza di altri riferimenti attivi, e pertanto sarà
392 ovviamente efficace anche per tutti gli altri file descriptor con cui si fa
393 riferimento allo stesso socket.
394
395 Il caso più comune di uso di \func{shutdown} è comunque quello della chiusura
396 del lato in scrittura, per segnalare all'altro capo della connessione che si è
397 concluso l'invio dei dati, restando comunque in grado di ricevere quanto
398 ancora questi potrà inviarci. Questo è ad esempio l'uso che ci serve per
399 rendere finalmente completo il nostro esempio sul servizio echo. Il nostro
400 client infatti presenta ancora un problema, che nell'uso che finora ne abbiamo
401 fatto non è emerso, ma che ci aspetta dietro l'angolo non appena usciamo
402 dall'uso interattivo e proviamo ad eseguirlo redirigendo standard input e
403 standard output. Così se eseguiamo:
404 \begin{verbatim}
405 [piccardi@gont sources]$ ./echo 192.168.1.1 < ../fileadv.tex  > copia
406 \end{verbatim}%$
407 vedremo che il file \texttt{copia} risulta mancare della parte finale.
408
409 Per capire cosa avviene in questo caso occorre tenere presente come avviene la
410 comunicazione via rete; quando redirigiamo lo standard input il nostro client
411 inizierà a leggere il contenuto del file \texttt{../fileadv.tex} a blocchi di
412 dimensione massima pari a \texttt{MAXLINE} per poi scriverlo, alla massima
413 velocità consentitagli dalla rete, sul socket. Dato che la connessione è con
414 una macchina remota occorre un certo tempo perché i pacchetti vi arrivino,
415 vengano processati, e poi tornino indietro. Considerando trascurabile il tempo
416 di processo, questo tempo, detto RTT (da \textit{Round Trip Time} può essere
417 stimato con l'uso del comando \cmd{ping}. Ma mantre il pacchetti sono in
418 transito sulla rete il client continua a leggere e a scrivere fintanto che il
419 file in ingresso finisce. 
420
421 A questo punto, se torniamo al codice mostrato in
422 \figref{fig:TCP_ClientEcho_third}, notiamo che non appena viene ricevuto un
423 end-of-file in ingresso il nostro client termina. Nel caso interattivo, in cui
424 si inviavano brevi stringe una alla volta, c'era sempre il tempo di eseguire
425 la lettura completa di quanto il server rimandava indietro. In questo caso
426 però quando il client termina, essendo la comunicazione a piena velocità, ci
427 saranno ancora pacchetti in transito sulla rete, ma siccome il client esce
428 immediatamente dopo la fine del file in ingresso, questi non faranno a tempo a
429 completare il percorso e verranno persi.
430
431 Per evitare questo tipo di problema occorre, invece di uscire, usare
432 \func{shutdown} per effettuare la chiusura del socket in scrittura una volta
433 completata la lettura del file in ingresso. In questo modo il client segnalerà
434 al server la chiusura del flusso dei dati, ma potrà continuare a leggere
435 quanto il server gli sta ancora inviando fino a quando quest'ultimo,
436 riconosciuta la chiusura del socket in scrittura da parte del client,
437 effettuerà la chiusura dello stesso a sua volta. Solo alla ricezione della
438 chiusura del socket da parte del server, si potrà essere sicuri della
439 ricezione di tutti i dati prima della terminazione della connessione.
440
441 \begin{figure}[!htb]
442   \footnotesize \centering
443   \begin{minipage}[c]{15.6cm}
444     \includecodesample{listati/ClientEcho.c}
445   \end{minipage} 
446   \normalsize
447   \caption{La sezione nel codice della versione finale della funzione
448     \func{ClientEcho}, che usa \func{shutdown} per una conclusione corretta
449     della connessione.}
450   \label{fig:TCP_ClientEcho}
451 \end{figure}
452
453 Si è allora riportato in \figref{fig:TCP_ClientEcho} la versione finale della
454 nostra funzione \func{ClientEcho}, in grado di gestire correttamente l'intero
455 flusso di dati fra client e server. Il codice completo del client,
456 comprendente la gestione delle opzioni a riga di comando e le istruzioni per
457 la creazione della connessione, si trova nel file \file{TCP\_echo.c},
458 distribuito coi sorgenti allegati alla guida.
459
460 La nuova versione è molto simile alla precedente di
461 \figref{fig:TCP_ClientEcho_third}; la prima differenza è l'introduzione
462 (\texttt{\small 7}) della variabile \var{eof}, inizializzata ad un valore
463 nullo, che serve a mantenere traccia dell'avvenuta conclusione della lettura
464 del file in ingresso.
465
466 La seconda modifica (\texttt{\small 12--15}) è stata quella di rendere
467 subordinato ad un valore nullo di \var{eof} l'impostazione del file descriptor
468 set per l'osservazione dello standard input. Se infatti il valore di \var{eof}
469 è non nullo significa che si è già raggiunta la fine del file in ingresso ed è
470 pertanto inutile continuare a tenere sotto controllo lo standard input nella
471 successiva (\texttt{\small 16}) chiamata a \func{select}.
472
473 Le maggiori modifiche rispetto alla precedente versione sono invece nella
474 gestione (\texttt{\small 18--22}) del caso in cui la lettura con \func{fgets}
475 restitisca un valore nullo, indice della fine del file, che prima causava
476 l'immediato ritorno della funzione. In questo caso prima (\texttt{\small 19})
477 si imposta opportunamente \var{eof} ad un valore non nullo, dopo di che
478 (\texttt{\small 20}) si effettua la chiusura del lato in scrittura del socket
479 con \func{shutdown}. Infine (\texttt{\small 21}) si usa la macro
480 \macro{FD\_CLR} per togliere lo standard input dal file descriptor set.
481
482 In questo modo anche se la lettura del file in ingresso è conclusa, la
483 funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua
484 ad eseguirlo ripetendo la chiamata a \func{select} per tenere sotto controllo
485 soltanto il socket connesso, dal quale possono arrivare altri dati, che
486 saranno letti (\texttt{\small 31}), ed opportunamente trascritti
487 (\texttt{\small 44--48}) sullo standard input.
488
489 Il ritorno della funzione, e la conseguente terminazione normale del client,
490 viene invece adesso gestito all'interno (\texttt{\small 30--49}) della lettura
491 dei dati dal socket; se infatti dalla lettura del socket si riceve una
492 condizione di end-of-file, la si tratterà (\texttt{\small 36--43}) in maniera
493 diversa a seconda del valore di \var{eof}. Se infatti questa è diversa da zero
494 (\texttt{\small 37--39}), essendo stata completata la lettura del file in
495 ingresso, vorrà dire che anche il server ha concluso la trasmissione dei dati
496 restanti, e si potrà uscire senza errori, altrimenti si stamperà
497 (\texttt{\small 40--42}) un messaggio di errore per la chiusura precoce della
498 connesione.
499
500
501
502 \section{Le opzioni dei socket}
503 \label{sec:TCP_sock_options}
504
505 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
506 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
507 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
508 capitolo dedicato alla trattazione generica dei socket.
509
510
511
512 \section{I dati \textit{out-of-band}}
513 \label{sec:TCP_urgent_data}
514
515 Una caratteristica speciale dei socket TCP è quella della presenza dei
516 cosiddetti dati \textit{out-of-band}
517
518
519
520
521 %%% Local Variables: 
522 %%% mode: latex
523 %%% TeX-master: "gapil"
524 %%% End: