91a5ada2f0cf7036f8a7222d4b3f3f46dc9b7e12
[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 l'uso
381 di \func{close} si limiterà a deallocare nel processo corrente il file
382 descriptor utilizzato, ma il socket resterà pienamente accessibile attraverso
383 tutti gli altri riferimenti. Se torniamo all'esempio originale del server di
384 \figref{fig:TCP_echo_server_first_code} abbiamo infatti che ci sono due
385 \func{close}, una sul socket connesso nel padre, ed una sul socket in ascolto
386 nel figlio, ma queste non effettuano nessuna chiusura reale di detti socket,
387 dato che restano altri riferimenti attivi, uno al socket connesso nel figlio
388 ed uno a quello in ascolto nel padre.
389
390 Questo non avviene affatto se si usa \func{shutdown} con argomento
391 \macro{SHUT\_RDWR} al posto di \func{close}; in questo caso infatti la
392 chiusura del socket viene effettuata immediatamente, indipendentemente dalla
393 presenza di altri riferimenti attivi, e pertanto sarà efficace anche per tutti
394 gli altri file descriptor con cui, nello stesso o in altri processi, si fa
395 riferimento allo stesso socket.
396
397 Il caso più comune di uso di \func{shutdown} è comunque quello della chiusura
398 del lato in scrittura, per segnalare all'altro capo della connessione che si è
399 concluso l'invio dei dati, restando comunque in grado di ricevere quanto
400 questi potrà ancora inviarci. Questo è ad esempio l'uso che ci serve per
401 rendere finalmente completo il nostro esempio sul servizio \textit{echo}. Il
402 nostro client infatti presenta ancora un problema, che nell'uso che finora ne
403 abbiamo fatto non è emerso, ma che ci aspetta dietro l'angolo non appena
404 usciamo dall'uso interattivo e proviamo ad eseguirlo redirigendo standard
405 input e standard output. Così se eseguiamo:
406 \begin{verbatim}
407 [piccardi@gont sources]$ ./echo 192.168.1.1 < ../fileadv.tex  > copia
408 \end{verbatim}%$
409 vedremo che il file \texttt{copia} risulta mancare della parte finale.
410
411 Per capire cosa avviene in questo caso occorre tenere presente come avviene la
412 comunicazione via rete; quando redirigiamo lo standard input il nostro client
413 inizierà a leggere il contenuto del file \texttt{../fileadv.tex} a blocchi di
414 dimensione massima pari a \texttt{MAXLINE} per poi scriverlo, alla massima
415 velocità consentitagli dalla rete, sul socket. Dato che la connessione è con
416 una macchina remota occorre un certo tempo perché i pacchetti vi arrivino,
417 vengano processati, e poi tornino indietro. Considerando trascurabile il tempo
418 di processo, questo tempo è quello impiegato nella trasmissione via rete, che
419 viene detto RTT (dalla denominazione inglese \textit{Round Trip Time}) ed è
420 quello che viene stimato con l'uso del comando \cmd{ping}.
421
422 A questo punto, se torniamo al codice mostrato in
423 \figref{fig:TCP_ClientEcho_third}, possiamo vedere che mentre i pacchetti sono
424 in transito sulla rete il client continua a leggere e a scrivere fintanto che
425 il file in ingresso finisce. Però non appena viene ricevuto un end-of-file in
426 ingresso il nostro client termina. Nel caso interattivo, in cui si inviavano
427 brevi stringhe una alla volta, c'era sempre il tempo di eseguire la lettura
428 completa di quanto il server rimandava indietro. In questo caso invece, quando
429 il client termina, essendo la comunicazione saturata e a piena velocità, ci
430 saranno ancora pacchetti in transito sulla rete che devono arrivare al server
431 e poi tornare indietro, ma siccome il client esce immediatamente dopo la fine
432 del file in ingresso, questi non faranno a tempo a completare il percorso e
433 verranno persi.
434
435 Per evitare questo tipo di problema, invece di uscire una volta completata la
436 lettura del file in ingresso, occorre usare \func{shutdown} per effettuare la
437 chiusura del lato in scrittura del socket. In questo modo il client segnalerà
438 al server la chiusura del flusso dei dati, ma potrà continuare a leggere
439 quanto il server gli sta ancora inviando indietro, fino a quando anch'esso,
440 riconosciuta la chiusura del socket in scrittura da parte del client,
441 effettuerà la chiusura dalla sua parte. Solo alla ricezione della chiusura del
442 socket da parte del server il client potrà essere sicuro della ricezione di
443 tutti i dati e della terminazione effettiva della connessione.
444
445 \begin{figure}[!htb]
446   \footnotesize \centering
447   \begin{minipage}[c]{15.6cm}
448     \includecodesample{listati/ClientEcho.c}
449   \end{minipage} 
450   \normalsize
451   \caption{La sezione nel codice della versione finale della funzione
452     \func{ClientEcho}, che usa \func{shutdown} per una conclusione corretta
453     della connessione.}
454   \label{fig:TCP_ClientEcho}
455 \end{figure}
456
457 Si è allora riportato in \figref{fig:TCP_ClientEcho} la versione finale della
458 nostra funzione \func{ClientEcho}, in grado di gestire correttamente l'intero
459 flusso di dati fra client e server. Il codice completo del client,
460 comprendente la gestione delle opzioni a riga di comando e le istruzioni per
461 la creazione della connessione, si trova nel file \file{TCP\_echo.c},
462 distribuito coi sorgenti allegati alla guida.
463
464 La nuova versione è molto simile alla precedente di
465 \figref{fig:TCP_ClientEcho_third}; la prima differenza è l'introduzione
466 (\texttt{\small 7}) della variabile \var{eof}, inizializzata ad un valore
467 nullo, che serve a mantenere traccia dell'avvenuta conclusione della lettura
468 del file in ingresso.
469
470 La seconda modifica (\texttt{\small 12--15}) è stata quella di rendere
471 subordinato ad un valore nullo di \var{eof} l'impostazione del file descriptor
472 set per l'osservazione dello standard input. Se infatti il valore di \var{eof}
473 è non nullo significa che si è già raggiunta la fine del file in ingresso ed è
474 pertanto inutile continuare a tenere sotto controllo lo standard input nella
475 successiva (\texttt{\small 16}) chiamata a \func{select}.
476
477 Le maggiori modifiche rispetto alla precedente versione sono invece nella
478 gestione (\texttt{\small 18--22}) del caso in cui la lettura con \func{fgets}
479 restituisce un valore nullo, indice della fine del file. Questa nella
480 precedente versione causava l'immediato ritorno della funzione; in questo caso
481 prima (\texttt{\small 19}) si imposta opportunamente \var{eof} ad un valore
482 non nullo, dopo di che (\texttt{\small 20}) si effettua la chiusura del lato
483 in scrittura del socket con \func{shutdown}. Infine (\texttt{\small 21}) si
484 usa la macro \macro{FD\_CLR} per togliere lo standard input dal file
485 descriptor set.
486
487 In questo modo anche se la lettura del file in ingresso è conclusa, la
488 funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua
489 ad eseguirlo ripetendo la chiamata a \func{select} per tenere sotto controllo
490 soltanto il socket connesso, dal quale possono arrivare altri dati, che
491 saranno letti (\texttt{\small 31}), ed opportunamente trascritti
492 (\texttt{\small 44--48}) sullo standard output.
493
494 Il ritorno della funzione, e la conseguente terminazione normale del client,
495 viene invece adesso gestito all'interno (\texttt{\small 30--49}) della lettura
496 dei dati dal socket; se infatti dalla lettura del socket si riceve una
497 condizione di end-of-file, la si tratterà (\texttt{\small 36--43}) in maniera
498 diversa a seconda del valore di \var{eof}. Se infatti questa è diversa da zero
499 (\texttt{\small 37--39}), essendo stata completata la lettura del file in
500 ingresso, vorrà dire che anche il server ha concluso la trasmissione dei dati
501 restanti, e si potrà uscire senza errori, altrimenti si stamperà
502 (\texttt{\small 40--42}) un messaggio di errore per la chiusura precoce della
503 connessione.
504
505
506 \subsection{Un server basato sull'I/O multiplexing}
507 \label{sec:TCP_serv_select}
508
509 Seguendo di nuovo le orme di Stevens in \cite{UNP1} vediamo ora come con
510 l'utilizzo dell'I/O multiplexing diventi possibile riscrivere completamente il
511 nostro server \textit{echo} con una architettura completamente diversa, in
512 modo da evitare di dover creare un nuovo processo tutte le volte che si ha una
513 connessione.\footnote{ne faremo comunque una implementazione diversa rispetto
514   a quella presentata da Stevens in \cite{UNP1}.}
515
516 La struttura del nuovo server è illustrata in \figref{fig:TCP_echo_multiplex},
517 in questo caso avremo un solo processo che ad ogni nuova connessione da parte
518 di un client sul socket in ascolto si limiterà a registrare l'entrata in uso
519 di un nuovo file descriptor ed utilizzerà \func{select} per rilevare la
520 presenza di dati in arrivo su tutti i file descriptor attivi, operando
521 direttamente su ciascuno di essi.
522
523 \begin{figure}[htb]
524   \centering
525   \includegraphics[width=13cm]{img/TCPechoMult}
526   \caption{Schema del nuovo server echo basato sull'I/O multiplexing.}
527   \label{fig:TCP_echo_multiplex}
528 \end{figure}
529
530 La sezione principale del codice del nuovo server è illustrata in
531 \figref{fig:TCP_SelectEchod}. Si è tralasciata al solito la gestione delle
532 opzioni, che è identica alla versione precedente. Resta invariata anche tutta
533 la parte relativa alla gestione dei segnali, degli errori, e della cessione
534 dei privilegi, così come è identica la gestione della creazione del socket (si
535 può fare riferimento al codice già illustrato in
536 \secref{sec:TCPsimp_server_main}); al solito il codice completo del server è
537 disponibile coi sorgenti allegati nel file \texttt{select\_echod.c}.
538
539 \begin{figure}[!htbp]
540   \footnotesize \centering
541   \begin{minipage}[c]{15.6cm}
542     \includecodesample{listati/select_echod.c}
543   \end{minipage} 
544   \normalsize
545   \caption{La sezione principale del codice della nuova versione di server
546     \textit{echo} basati sull'uso della funzione \func{select}.}
547   \label{fig:TCP_SelectEchod}
548 \end{figure}
549
550 In questo caso, una volta aperto e messo in ascolto il socket, tutto quello
551 che ci servirà sarà chiamare \func{select} per rilevare la presenza di nuove
552 connessioni o di dati in arrivo, e processarli immediatamente. Per
553 implementare lo schema mostrato in \figref{fig:TCP_echo_multiplex}, il
554 programma usa una tabella dei socket connessi mantenuta nel vettore
555 \var{fd\_open} dimensionato al valore di \macro{FD\_SETSIZE}, ed una variabile
556 \var{max\_fd} per registrare il valore più alto dei file descriptor aperti.
557
558 Prima di entrare nel ciclo principale (\texttt{\small 6--56}) la nostra
559 tabella viene inizializzata (\texttt{\small 2}) a zero (valore che
560 utilizzeremo come indicazione del fatto che il relativo file descriptor non è
561 aperto), mentre il valore massimo (\texttt{\small 3}) per i file descriptor
562 aperti viene impostato a quello del socket in ascolto,\footnote{in quanto esso
563   è l'unico file aperto, oltre i tre standard, e pertanto avrà il valore più
564   alto.} che verrà anche (\texttt{\small 4}) inserito nella tabella.
565
566 La prima sezione (\texttt{\small 7--10}) del ciclo principale esegue la
567 costruzione del \textit{file descriptor set} \var{fset} in base ai socket
568 connessi in un certo momento; all'inizio ci sarà soltanto il socket in
569 ascolto, ma nel prosieguo delle operazioni, verranno utilizzati anche tutti i
570 socket connessi registrati nella tabella \var{fd\_open}.  Dato che la chiamata
571 di \func{select} modifica il valore del \textit{file descriptor set}, è
572 necessario ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi
573 procedere con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket
574 trovati attivi.
575
576 Per far questo si usa la caratteristica dei file descriptor, descritta in
577 \secref{sec:file_open}, per cui il kernel associa sempre ad ogni nuovo file il
578 file descriptor con il valore più basso disponibile. Questo fa sì che si possa
579 eseguire il ciclo (\texttt{\small 8}) a partire da un valore minimo, che sarà
580 sempre quello del socket in ascolto, mantenuto in \var{list\_fd}, fino al
581 valore massimo di \var{max\_fd} che dovremo aver cura di tenere aggiornato.
582 Dopo di che basterà controllare (\texttt{\small 9}) nella nostra tabella se il
583 file descriptor è in uso o meno,\footnote{si tenga presente che benché il
584   kernel assegni sempre il primo valore libero, dato che nelle operazioni i
585   socket saranno aperti e chiusi in corrispondenza della creazione e
586   conclusione delle connessioni, si potranno sempre avere dei \textsl{buchi}
587   nella nostra tabella.} e impostare \var{fset} di conseguenza.
588
589 Una volta inizializzato con i socket aperti il nostro \textit{file descriptor
590   set} potremo chiamare \func{select} per fargli osservare lo stato degli
591 stessi (in lettura, presumendo che la scrittura sia sempre consentita). Come
592 per il precedente esempio di \secref{sec:TCP_child_hand}, essendo questa
593 l'unica funzione che può bloccarsi, ed essere interrotta da un segnale, la
594 eseguiremo (\texttt{\small 11--12}) all'interno di un ciclo di \code{while}
595 che la ripete indefinitamente qualora esca con un errore di \errcode{EINTR}.
596 Nel caso invece di un errore normale si provvede (\texttt{\small 13--16}) ad
597 uscire stampando un messaggio di errore.
598
599 Se invece la funzione ritorna normalmente avremo in \var{n} il numero di
600 socket da controllare. Nello specifico si danno due possibili casi diversi per
601 cui \func{select} può essere ritornata: o si è ricevuta una nuova connessione
602 ed è pronto il socket in ascolto, sul quale si può eseguire \func{accept} o
603 c'è attività su uno dei socket connessi, sui quali si può eseguire
604 \func{read}.
605
606 Il primo caso viene trattato immediatamente (\texttt{\small 17--26}): si
607 controlla (\texttt{\small 17}) che il socket in ascolto sia fra quelli attivi,
608 nel qual caso anzitutto (\texttt{\small 18}) se ne decrementa il numero in
609 \var{n}; poi, inizializzata (\texttt{\small 19}) la lunghezza della struttura
610 degli indirizzi, si esegue \func{accept} per ottenere il nuovo socket connesso
611 controllando che non ci siano errori (\texttt{\small 20--23}). In questo caso
612 non c'è più la necessità di controllare per interruzioni dovute a segnali, in
613 quanto siamo sicuri che \func{accept} non si bloccherà. Per completare la
614 trattazione occorre a questo punto aggiungere (\texttt{\small 24}) il nuovo
615 file descriptor alla tabella di quelli connessi, ed inoltre, se è il caso,
616 aggiornare (\texttt{\small 25}) il valore massimo in \var{max\_fd}.
617
618 Una volta controllato l'arrivo di nuove connessioni si passa a verificare se
619 vi sono dati sui socket connessi, per questo si ripete un ciclo
620 (\texttt{\small 29--55}) fintanto che il numero di socket attivi \var{n} resta
621 diverso da zero; in questo modo se l'unico socket con attività era quello
622 connesso, avendo opportunamente decrementato il contatore, il ciclo verrà
623 saltato, e si ritornerà immediatamente (ripetuta l'inizializzazione del file
624 descriptor set con i nuovi valori nella tabella) alla chiamata di
625 \func{accept}. Se il socket attivo non è quello in ascolto, o ce ne sono
626 comunque anche altri, il valore di \var{n} non sarà nullo ed il controllo sarà
627 eseguito. Prima di entrare nel ciclo comunque si inizializza (\texttt{\small
628   28}) il valore della variabile \var{i} che useremo come indice nella tabella
629 \var{fd\_open} al valore minimo, corrispondente al file descriptor del socket
630 in ascolto.
631
632 Il primo passo (\texttt{\small 30}) nella verifica è incrementare il valore
633 dell'indice \var{i} per posizionarsi sul primo valore possibile per un file
634 descriptor associato ad un eventuale socket connesso, dopo di che si controlla
635 (\texttt{\small 31}) se questo è nella tabella dei socket connessi, chiedendo
636 la ripetizione del ciclo in caso contrario. Altrimenti si passa a verificare
637 (\texttt{\small 32}) se il file descriptor corrisponde ad uno di quelli
638 attivi, e nel caso si esegue (\texttt{\small 33}) una lettura, uscendo con un
639 messaggio in caso di errore (\texttt{\small 34--38}).
640
641 Se (\texttt{\small 39}) il numero di byte letti \var{nread} è nullo si è in
642 presenza del caso di un \textit{end-of-file}, indice che una connessione che
643 si è chiusa, che deve essere trattato (\texttt{\small 39--48}) opportunamente.
644 Il primo passo è chiudere (\texttt{\small 40}) anche il proprio capo del
645 socket e rimuovere (\texttt{\small 41}) il file descriptor dalla tabella di
646 quelli aperti, inoltre occorre verificare (\texttt{\small 42}) se il file
647 descriptor chiuso è quello con il valore più alto, nel qual caso occorre
648 trovare (\texttt{\small 42--46}) il nuovo massimo, altrimenti (\texttt{\small
649   47}) si può ripetere il ciclo da capo per esaminare (se ne restano)
650 ulteriori file descriptor attivi.
651
652 Se però è stato chiuso il file descriptor più alto, dato che la scansione dei
653 file descriptor attivi viene fatta a partire dal valore più basso, questo
654 significa che siamo anche arrivati alla fine della scansione, per questo
655 possiamo utilizzare direttamente il valore dell'indice \var{i} con un ciclo
656 all'indietro (\texttt{\small 43}) che trova il primo valore per cui la tabella
657 presenta un file descriptor aperto, e lo imposta (\texttt{\small 44}) come
658 nuovo massimo, per poi tornare (\texttt{\small 44}) al ciclo principale con un
659 \code{break}, e rieseguire \func{select}.
660
661 Se infine si sono effettivamente letti dei dati dal socket (ultimo caso
662 rimasto) si potrà invocare immediatamente (\texttt{\small 49})
663 \func{FullWrite} per riscriverli indietro sul socket stesso, avendo cura di
664 uscire con un messaggio in caso di errore (\texttt{\small 50--53}). Si noti
665 che nel ciclo si esegue una sola lettura, contrariamente a quanto fatto con la
666 precedente versione (si riveda il codice di \secref{fig:TCP_ServEcho_second})
667 in cui si continuava a leggere fintanto che non si riceveva un
668 \textit{end-of-file}, questo perché usando l'\textit{I/O multiplexing} non si
669 vuole essere bloccati in lettura.  L'uso di \func{select} ci permette di
670 trattare automaticamente anche il caso in cui la \func{read} non è stata in
671 grado di leggere tutti i dati presenti sul socket, dato che alla iterazione
672 successiva \func{select} ritornerà immediatamente segnalando l'ulteriore
673 disponibilità.
674
675 Il nostro server comunque soffre di una vulnerabilità per un attacco di tipo
676 \textit{Denial of Service}. Il problema è che in caso di blocco di una
677 qualunque delle funzioni di I/O, non avendo usato processi separati, tutto il
678 server si ferma e non risponde più a nessuna richiesta. Abbiamo scongiurato
679 questa evenienza per l'I/O in ingresso con l'uso di \func{select}, ma non vale
680 altrettanto per l'I/O in uscita. Il problema pertanto può sorgere qualora una
681 delle chiamate a \func{write} effettuate da \func{FullWrite} si blocchi. Con
682 il funzionamento normale questo non accade in quanto il server si limita a
683 scrivere quanto riceve in ingresso, ma qualora venga utilizzato un client
684 malevolo che esegua solo scritture e non legga mai indietro l'\textsl{eco} del
685 server, si potrebbe giungere alla saturazione del buffer di scrittura, ed al
686 conseguente blocco del server su di una \func{write}.
687
688 Le possibili soluzioni in questo caso sono quelle di ritornare ad eseguire il
689 ciclo di risposta alle richieste all'interno di processi separati, utilizzare
690 un timeout per le operazioni di scrittura, o eseguire queste ultime in
691 modalità non bloccante, concludendo le operazioni qualora non vadano a buon
692 fine.
693
694
695
696 \subsection{I/O multiplexing con \func{poll}}
697 \label{sec:TCP_serv_poll}
698
699 Finora abbiamo trattato le problematiche risolubili con l'I/O multiplexing
700 impiegando la funzione \func{select}; questo è quello che avviene nella
701 maggior parte dei casi, in quanto essa è nata sotto BSD proprio per affrontare
702 queste problematiche con i socket.  Abbiamo però visto in
703 \secref{sec:file_multiplexing} come la funzione \func{poll} possa costituire
704 una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo
705   delle limitazioni dovute all'uso dei \textit{file descriptor set}.}
706
707 Ancora una volta in \secref{sec:file_poll} abbiamo trattato la funzione in
708 maniera generica, parlando di file descriptor, ma come per \func{select}
709 quando si ha a che fare con dei socket il concetto di essere \textsl{pronti}
710 per l'I/O deve essere specificato nei dettagli, per tener conto delle
711 condizioni della rete. Inoltre deve essere specificato come viene classificato
712 il traffico nella suddivisione fra dati normali e prioritari. In generale
713 pertanto:
714 \begin{itemize}
715 \item i dati trasmessi su un socket vengono considerati traffico normale,
716   pertanto vengono rilevati da una selezione con \const{POLLIN} o
717   \const{POLLRDNORM}.
718 \item i dati \textit{out-of-band} su un socket TCP vengono considerati
719   traffico prioritario e vengono rilevati da una condizione \const{POLLIN},
720   \const{POLLPRI} o \const{POLLRDBAND}.
721 \item la chiusura di una connessione (cioè la ricezione di un segmento FIN)
722   viene considerato traffico normale, pertanto viene rilevato da una
723   condizione \const{POLLIN} o \const{POLLRDNORM}, ma una conseguente chiamata
724   a \func{read} restituirà 0.
725 \item la presenza di un errore sul socket (sia dovuta ad un segmento RST che a
726   timeout) viene considerata traffico normale, ma viene segnalata anche dalla
727   condizione \const{POLLERR}.
728 \item la presenza di una nuova connessione su un socket in ascolto può essere
729   considerata sia traffico normale che prioritario, nel caso di Linux
730   l'implementazione la classifica come normale.
731 \end{itemize}
732
733 Come esempio dell'uso di \func{poll} proviamo allora a reimplementare il
734 server \textit{echo} secondo lo schema di \figref{fig:TCP_echo_multiplex}
735 usando \func{poll} al posto di \func{select}. In questo caso dovremo fare
736 qualche modifica, per tenere conto della diversa sintassi delle due funzioni,
737 ma la struttura del programma resta sostanzialmente la stessa.
738
739
740 \begin{figure}[!htbp]
741   \footnotesize \centering
742   \begin{minipage}[c]{15.6cm}
743     \includecodesample{listati/poll_echod.c}
744   \end{minipage} 
745   \normalsize
746   \caption{La sezione principale del codice della nuova versione di server
747     \textit{echo} basati sull'uso della funzione \func{poll}.}
748   \label{fig:TCP_PollEchod}
749 \end{figure}
750
751 In \figref{fig:TCP_PollEchod} è riportata la sezione principale della nuova
752 versione del server, la versione completa del codice è riportata nel file
753 \file{poll\_echod.c} dei sorgenti allegati alla guida. Al solito nella figura
754 si sono tralasciate la gestione delle opzioni, la creazione del socket in
755 ascolto, la cessione dei privilegi e le operazioni necessarie a far funzionare
756 il programma come demone, privilegiando la sezione principale del programma.
757
758 Come per il precedente server basato su \func{select} il primo passo
759 (\texttt{\small 2--8}) è quello di inizializzare le variabili necessarie. Dato
760 che in questo caso dovremo usare un vettore di strutture occorre anzitutto
761 (\texttt{\small 2}) allocare la memoria necessaria utilizzando il numero
762 massimo \var{n} di socket osservabili, che viene impostato attraverso
763 l'opzione \texttt{-n} ed ha un valore di default di 256. 
764
765 Dopo di che si preimposta (\texttt{\small 3}) il valore \var{max\_fd} del file
766 descriptor aperto con valore più alto a quello del socket in ascolto (al
767 momento l'unico), e si provvede (\texttt{\small 4--7}) ad inizializzare le
768 strutture, disabilitando (\texttt{\small 5}) l'osservazione con un valore
769 negativo del campo \var{fd} ma predisponendo (\texttt{\small 6}) il campo
770 \var{events} per l'osservazione dei dati normali con \const{POLLRDNORM}.
771 Infine (\texttt{\small 8}) si attiva l'osservazione del socket in ascolto
772 inizializzando la corrispondente struttura. Questo metodo comporta, in
773 modalità interattiva, lo spreco di tre strutture (quelle relative a standard
774 input, output ed error) che non vengono mai utilizzate in quanto la prima è
775 sempre quella relativa al socket in ascolto.
776
777 Una volta completata l'inizializzazione tutto il lavoro viene svolto
778 all'interno del ciclo principale \texttt{\small 10--55}) che ha una struttura
779 sostanzialmente identica a quello usato per il precedente esempio basato su
780 \func{select}. La prima istruzione (\texttt{\small 11--12}) è quella di
781 eseguire \func{poll} all'interno di un ciclo che la ripete qualora venisse
782 interrotta da un segnale, da cui si esce soltanto quando la funzione ritorna,
783 restituendo nella variabile \var{n} il numero di file descriptor trovati
784 attivi.  Qualora invece si sia ottenuto un errore si procede (\texttt{\small
785   13--16}) alla terminazione immediata del processo provvedendo a stampare una
786 descrizione dello stesso.
787
788 Una volta ottenuta dell'attività su un file descriptor si hanno di nuovo due
789 possibilità. La prima possibilità è che ci sia attività sul socket in ascolto,
790 indice di una nuova connessione, nel qual caso si controlla (\texttt{\small
791   17}) se il campo \var{revents} della relativa struttura è attivo; se è così
792 si provvede (\texttt{\small 18}) a decrementare la variabile \var{n} (che
793 assume il significato di numero di file descriptor attivi rimasti da
794 controllare) per poi (\texttt{\small 19--23}) effettuare la chiamata ad
795 \func{accept}, terminando il processo in caso di errore. Se la chiamata ad
796 \func{accept} ha successo si procede attivando (\texttt{\small 24}) la
797 struttura relativa al nuovo file descriptor da essa ottenuto, modificando
798 (\texttt{\small 24}) infine quando necessario il valore massimo dei file
799 descriptor aperti mantenuto in \var{max\_fd}.
800
801 La seconda possibilità è che vi sia dell'attività su uno dei socket aperti in
802 precedenza, nel qual caso si inizializza (\texttt{\small 27}) l'indice \var{i}
803 del vettore delle strutture \struct{pollfd} al valore del socket in ascolto,
804 dato che gli ulteriori socket aperti avranno comunque un valore superiore.  Il
805 ciclo (\texttt{\small 28--54}) prosegue fintanto che il numero di file
806 descriptor attivi, mantenuto nella variabile \var{n}, è diverso da zero. Se
807 pertanto ci sono ancora socket attivi da individuare si comincia con
808 l'incrementare (\texttt{\small 30}) l'indice e controllare (\texttt{\small
809   31}) se corrisponde ad un file descriptor in uso, analizzando il valore del
810 campo \var{fd} della relativa struttura, e chiudendo immediatamente il ciclo
811 qualora non lo sia. Se invece il file descriptor è in uso si verifica
812 (\texttt{\small 31}) se c'è stata attività controllando il campo
813 \var{revents}. 
814
815 Di nuovo se non si verifica la presenza di attività il ciclo si chiude subito,
816 altrimenti si provvederà (\texttt{\small 32}) a decrementare il numero \var{n}
817 di file descriptor attivi da controllare e ad eseguire (\texttt{\small 33}) la
818 lettura, ed in caso di errore (\texttt{\small 34--37}) al solito lo si
819 notificherà uscendo immediatamente. Qualora invece si ottenga una condizione
820 di end-of-file (\texttt{\small 38--47}) si provvederà a chiudere
821 (\texttt{\small 39}) anche il nostro capo del socket e a marcarlo
822 (\texttt{\small 40}) nella struttura ad esso associata come inutilizzato.
823 Infine dovrà essere ricalcolato (\texttt{\small 41--45}) un eventiale nuovo
824 valore di \var{max\_fd}. L'ultimo passo è (\texttt{\small 46}) chiudere il
825 ciclo in quanto in questo caso non c'è più niente da riscrivere all'indietro
826 sul socket.
827
828 Se invece si sono letti dei dati si provvede (\texttt{\small 48}) ad
829 effettuarne la riscrittura all'indietro, con il solito controllo ed eventuale
830 uscita e notifica in caso si errore (\texttt{\small 49--52}).
831
832
833
834 \section{Le opzioni dei socket}
835 \label{sec:TCP_sock_options}
836
837 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
838 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
839 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
840 capitolo dedicato alla trattazione generica dei socket.
841
842
843
844 \section{I dati \textit{out-of-band}}
845 \label{sec:TCP_urgent_data}
846
847 Una caratteristica speciale dei socket TCP è quella della presenza dei
848 cosiddetti dati \textit{out-of-band}
849
850
851
852
853 %%% Local Variables: 
854 %%% mode: latex
855 %%% TeX-master: "gapil"
856 %%% End: