Correzioni varie piu una serie di precisazioni sull'uso di recvfrom
[gapil.git] / othersock.tex
1 %% othersock.tex
2 %%
3 %% Copyright (C) 2004-2009 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 "Un preambolo",
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
12 \chapter{Gli altri tipi di socket}
13 \label{cha:other_socket}
14
15 Dopo aver trattato in cap.~\ref{cha:TCP_socket} i socket TCP, che
16 costituiscono l'esempio più comune dell'interfaccia dei socket, esamineremo in
17 questo capitolo gli altri tipi di socket, a partire dai socket UDP, e i socket
18 \textit{Unix domain} già incontrati in sez.~\ref{sec:ipc_socketpair}.
19
20
21 \section{I socket UDP}
22 \label{sec:UDP_socket}
23
24 Dopo i socket TCP i socket più utilizzati nella programmazione di rete sono i
25 socket UDP: protocolli diffusi come NFS o il DNS usano principalmente questo
26 tipo di socket. Tratteremo in questa sezione le loro caratteristiche
27 principali e le modalità per il loro utilizzo.
28
29
30 \subsection{Le caratteristiche di un socket UDP}
31 \label{sec:UDP_characteristics}
32
33 Come illustrato in sez.\ref{sec:net_udp} UDP è un protocollo molto semplice che
34 non supporta le connessioni e non è affidabile: esso si appoggia direttamente
35 sopra IP (per i dettagli sul protocollo si veda sez.~\ref{sec:udp_protocol}).
36 I dati vengono inviati in forma di pacchetti, e non ne è assicurata né la
37 effettiva ricezione né l'arrivo nell'ordine in cui vengono inviati. Il
38 vantaggio del protocollo è la velocità, non è necessario trasmettere le
39 informazioni di controllo ed il risultato è una trasmissione di dati più
40 veloce ed immediata.
41
42 Questo significa che a differenza dei socket TCP i socket UDP non supportano
43 una comunicazione di tipo \textit{stream} in cui si ha a disposizione un
44 flusso continuo di dati che può essere letto un po' alla volta, ma piuttosto
45 una comunicazione di tipo \textit{datagram}, in cui i dati arrivano in singoli
46 blocchi che devono essere letti integralmente.
47
48 Questo diverso comportamento significa anche che i socket UDP, pur
49 appartenendo alla famiglia \const{PF\_INET}\footnote{o \const{PF\_INET6}
50   qualora si usasse invece il protocollo IPv6, che pure supporta UDP.} devono
51 essere aperti quando si usa la funzione \func{socket} (si riveda quanto
52 illustrato a suo tempo in tab.~\ref{tab:sock_sock_valid_combinations})
53 utilizzando per il tipo di socket il valore \const{SOCK\_DGRAM}.
54
55 Questa differenza comporta ovviamente che anche le modalità con cui si usano i
56 socket UDP sono completamente diverse rispetto ai socket TCP, ed in
57 particolare non esistendo il concetto di connessione non esiste il meccanismo
58 del \itindex{three~way~handshake} \textit{three way handshake} né quello degli
59 stati del protocollo. In realtà tutto quello che avviene nella comunicazione
60 attraverso dei socket UDP è la trasmissione di un pacchetto da un client ad un
61 server o viceversa, secondo lo schema illustrato in
62 fig.~\ref{fig:UDP_packet-exchange}.
63
64 \begin{figure}[htb]
65   \centering
66   \includegraphics[width=10cm]{img/udp_connection}  
67   \caption{Lo schema di interscambio dei pacchetti per una comunicazione via
68      UDP.}
69   \label{fig:UDP_packet-exchange}
70 \end{figure}
71
72 Come illustrato in fig.~\ref{fig:UDP_packet-exchange} la struttura generica di
73 un server UDP prevede, una volta creato il socket, la chiamata a \func{bind}
74 per mettersi in ascolto dei dati. Questa è l'unica parte comune con un server
75 TCP: non essendovi il concetto di connessione le funzioni \func{listen} ed
76 \func{accept} non sono mai utilizzate nel caso di server UDP. La ricezione dei
77 dati dal client avviene attraverso la funzione \func{recvfrom}, mentre una
78 eventuale risposta sarà inviata con la funzione \func{sendto}.
79
80 Da parte del client invece, una volta creato il socket non sarà necessario
81 connettersi con \func{connect} (anche se, come vedremo in
82 sez.~\ref{sec:UDP_connect}, è possibile usare questa funzione, con un
83 significato comunque diverso) ma si potrà effettuare direttamente una
84 richiesta inviando un pacchetto con la funzione \func{sendto} e si potrà
85 leggere una eventuale risposta con la funzione \func{recvfrom}.
86
87 Anche se UDP è completamente diverso rispetto a TCP resta identica la
88 possibilità di gestire più canali di comunicazione fra due macchine
89 utilizzando le porte. In questo caso il server dovrà usare comunque la
90 funzione \func{bind} per scegliere la porta su cui ricevere i dati, e come nel
91 caso dei socket TCP si potrà usare il comando \cmd{netstat} per
92 verificare quali socket sono in ascolto:
93 \begin{verbatim}
94 [piccardi@gont gapil]# netstat -anu
95 Active Internet connections (servers and established)
96 Proto Recv-Q Send-Q Local Address           Foreign Address         State
97 udp        0      0 0.0.0.0:32768           0.0.0.0:*
98 udp        0      0 192.168.1.2:53          0.0.0.0:*
99 udp        0      0 127.0.0.1:53            0.0.0.0:*
100 udp        0      0 0.0.0.0:67              0.0.0.0:*
101 \end{verbatim}
102 in questo caso abbiamo attivi il DNS (sulla porta 53, e sulla 32768 per la
103 connessione di controllo del server \cmd{named}) ed un server DHCP (sulla
104 porta 67).
105
106 Si noti però come in questo caso la colonna che indica lo stato sia vuota. I
107 socket UDP infatti non hanno uno stato. Inoltre anche in presenza di traffico
108 non si avranno indicazioni delle connessioni attive, proprio perché questo
109 concetto non esiste per i socket UDP, il kernel si limita infatti a ricevere i
110 pacchetti ed inviarli al processo in ascolto sulla porta cui essi sono
111 destinati, oppure a scartarli inviando un messaggio \textit{ICMP port
112   unreachable} qualora non vi sia nessun processo in ascolto.
113
114
115 \subsection{Le funzioni \func{sendto} e \func{recvfrom}}
116 \label{sec:UDP_sendto_recvfrom}
117
118 Come accennato in sez.~\ref{sec:UDP_characteristics} le due funzioni
119 principali usate per la trasmissione di dati attraverso i socket UDP sono
120 \func{sendto} e \func{recvfrom}. La necessità di usare queste funzioni è
121 dovuta al fatto che non esistendo con UDP il concetto di connessione, non si
122 ha neanche a disposizione un \textsl{socket connesso} su cui sia possibile
123 usare direttamente \func{read} e \func{write} avendo già stabilito (grazie
124 alla chiamata ad \func{accept} che lo associa ad una connessione) quali sono
125 sorgente e destinazione dei dati.
126
127 Per questo motivo nel caso di UDP diventa essenziale utilizzare queste due
128 funzioni, che sono comunque utilizzabili in generale per la trasmissione di
129 dati attraverso qualunque tipo di socket. Esse hanno la caratteristica di
130 prevedere tre argomenti aggiuntivi attraverso i quali è possibile specificare
131 la destinazione dei dati trasmessi o ottenere l'origine dei dati ricevuti. La
132 prima di queste funzioni è \funcd{sendto} ed il suo prototipo\footnote{il
133   prototipo illustrato è quello utilizzato dalle \acr{glibc}, che seguono le
134   \textit{Single Unix Specification}, l'argomento \param{flags} era di tipo
135   \texttt{int} nei vari BSD4.*, mentre nelle \acr{libc4} e \acr{libc5} veniva
136   usato un \texttt{unsigned int}; l'argomento \param{len} era \texttt{int} nei
137   vari BSD4.* e nelle \acr{libc4}, ma \type{size\_t} nelle \acr{libc5}; infine
138   l'argomento \param{tolen} era \texttt{int} nei vari BSD4.* nelle \acr{libc4}
139   e nelle \acr{libc5}.} è:
140 \begin{functions}
141   \headdecl{sys/types.h}
142   \headdecl{sys/socket.h}
143   
144   \funcdecl{ssize\_t sendto(int sockfd, const void *buf, size\_t len, int
145     flags, const struct sockaddr *to, socklen\_t tolen)}
146   
147   Trasmette un messaggio ad un altro socket.
148   
149   \bodydesc{La funzione restituisce il numero di caratteri inviati in caso di
150     successo e -1 per un errore; nel qual caso \var{errno} viene impostata al
151     rispettivo codice di errore:
152   \begin{errlist}
153   \item[\errcode{EAGAIN}] il socket è in modalità non bloccante, ma
154     l'operazione richiede che la funzione si blocchi.
155   \item[\errcode{ECONNRESET}] l'altro capo della comunicazione ha resettato la
156     connessione.
157   \item[\errcode{EDESTADDRREQ}] il socket non è di tipo connesso, e non si è
158     specificato un indirizzo di destinazione.
159   \item[\errcode{EISCONN}] il socket è già connesso, ma si è specificato un
160     destinatario.
161   \item[\errcode{EMSGSIZE}] il tipo di socket richiede l'invio dei dati in un
162     blocco unico, ma la dimensione del messaggio lo rende impossibile.
163   \item[\errcode{ENOBUFS}] la coda di uscita dell'interfaccia è già piena (di
164     norma Linux non usa questo messaggio ma scarta silenziosamente i
165     pacchetti).
166   \item[\errcode{ENOTCONN}] il socket non è connesso e non si è specificata
167     una destinazione.
168   \item[\errcode{EOPNOTSUPP}] il valore di \param{flag} non è appropriato per
169     il tipo di socket usato.
170   \item[\errcode{EPIPE}] il capo locale della connessione è stato chiuso, si
171     riceverà anche un segnale di \const{SIGPIPE}, a meno di non aver impostato
172     \const{MSG\_NOSIGNAL} in \param{flags}.
173   \end{errlist}
174   ed anche \errval{EFAULT}, \errval{EBADF}, \errval{EINVAL}, \errval{EINTR},
175   \errval{ENOMEM}, \errval{ENOTSOCK} più gli eventuali altri errori relativi
176   ai protocolli utilizzati.}
177 \end{functions}
178
179 I primi tre argomenti sono identici a quelli della funzione \func{write} e
180 specificano il socket \param{sockfd} a cui si fa riferimento, il buffer
181 \param{buf} che contiene i dati da inviare e la relativa lunghezza
182 \param{len}.  Come per \func{write} la funzione ritorna il numero di byte
183 inviati; nel caso di UDP però questo deve sempre corrispondere alla dimensione
184 totale specificata da \param{len} in quanto i dati vengono sempre inviati in
185 forma di pacchetto e non possono essere spezzati in invii successivi.  Qualora
186 non ci sia spazio nel buffer di uscita la funzione si blocca (a meno di non
187 avere aperto il socket in modalità non bloccante), se invece non è possibile
188 inviare il messaggio all'interno di un unico pacchetto (ad esempio perché
189 eccede le dimensioni massime del protocollo sottostante utilizzato) essa
190 fallisce con l'errore di \errcode{EMSGSIZE}. 
191
192 I due argomenti \param{to} e \param{tolen} servono a specificare la
193 destinazione del messaggio da inviare, e indicano rispettivamente la struttura
194 contenente l'indirizzo di quest'ultima e la sua dimensione; questi argomenti
195 vanno specificati stessa forma in cui li si sarebbero usati con
196 \func{connect}. Nel nostro caso \param{to} dovrà puntare alla struttura
197 contenente l'indirizzo IP e la porta di destinazione verso cui si vogliono
198 inviare i dati (questo è indifferente rispetto all'uso di TCP o UDP, usando
199 socket diversi si sarebbero dovute utilizzare le rispettive strutture degli
200 indirizzi).
201
202 Se il socket è di un tipo che prevede le connessioni (ad esempio un socket
203 TCP), questo deve essere già connesso prima di poter eseguire la funzione, in
204 caso contrario si riceverà un errore di \errcode{ENOTCONN}. In questo
205 specifico caso in cui gli argomenti \param{to} e \param{tolen} non servono
206 essi dovranno essere inizializzati rispettivamente a \const{NULL} e 0;
207 normalmente quando si opera su un socket connesso essi vengono ignorati, ma
208 qualora si sia specificato un indirizzo è possibile ricevere un errore di
209 \errcode{EISCONN}.
210
211 Finora abbiamo tralasciato l'argomento \param{flags}; questo è un intero usato
212 come maschera binaria che permette di impostare una serie di modalità di
213 funzionamento della comunicazione attraverso il socket (come
214 \const{MSG\_NOSIGNAL} che impedisce l'invio del segnale \const{SIGPIPE} quando
215 si è già chiuso il capo locale della connessione). Torneremo con maggiori
216 dettagli sul significato di questo argomento in sez.~\ref{sec:net_sendmsg},
217 dove tratteremo le funzioni avanzate dei socket, per il momento ci si può
218 limitare ad usare sempre un valore nullo.
219
220 La seconda funzione utilizzata nella comunicazione fra socket UDP è
221 \funcd{recvfrom}, che serve a ricevere i dati inviati da un altro socket; il
222 suo prototipo\footnote{il prototipo è quello delle \acr{glibc} che seguono le
223   \textit{Single Unix Specification}, i vari BSD4.*, le \acr{libc4} e le
224   \acr{libc5} usano un \texttt{int} come valore di ritorno; per gli argomenti
225   \param{flags} e \param{len} vale quanto detto a proposito di \func{sendto};
226   infine l'argomento \param{fromlen} è \texttt{int} per i vari BSD4.*, le
227   \acr{libc4} e le \acr{libc5}.} è:
228 \begin{functions}
229   \headdecl{sys/types.h}
230   \headdecl{sys/socket.h}
231   
232   \funcdecl{ssize\_t recvfrom(int sockfd, const void *buf, size\_t len, int
233     flags, const struct sockaddr *from, socklen\_t *fromlen)}
234   
235   Riceve un messaggio ad un socket.
236   
237   \bodydesc{La funzione restituisce il numero di byte ricevuti in caso di
238     successo e -1 in caso di errore; nel qual caso \var{errno} assumerà il
239     valore:
240   \begin{errlist}
241   \item[\errcode{EAGAIN}] il socket è in modalità non bloccante, ma
242     l'operazione richiede che la funzione si blocchi, oppure si è impostato un
243     timeout in ricezione e questo è scaduto.
244   \item[\errcode{ECONNREFUSED}] l'altro capo della comunicazione ha rifiutato
245     la connessione (in genere perché il relativo servizio non è disponibile).
246   \item[\errcode{ENOTCONN}] il socket è di tipo connesso, ma non si è eseguita
247     la connessione.
248   \end{errlist}
249   ed anche \errval{EFAULT}, \errval{EBADF}, \errval{EINVAL}, \errval{EINTR},
250   \errval{ENOMEM}, \errval{ENOTSOCK} più gli eventuali altri errori relativi
251   ai protocolli utilizzati.}
252 \end{functions}
253
254 Come per \func{sendto} i primi tre argomenti sono identici agli analoghi di
255 \func{read}: dal socket vengono letti \param{len} byte che vengono salvati nel
256 buffer \param{buf}. A seconda del tipo di socket (se di tipo \textit{datagram}
257 o di tipo \textit{stream}) i byte in eccesso che non sono stati letti possono
258 rispettivamente andare persi o restare disponibili per una lettura successiva.
259 Se non sono disponibili dati la funzione si blocca, a meno di non aver aperto
260 il socket in modalità non bloccante, nel qual caso si avrà il solito errore di
261 \errcode{EAGAIN}.  Qualora \param{len} ecceda la dimensione del pacchetto la
262 funzione legge comunque i dati disponibili, ed il suo valore di ritorno è
263 comunque il numero di byte letti.
264
265 I due argomenti \param{from} e \param{fromlen} sono utilizzati per ottenere
266 l'indirizzo del mittente del pacchetto che è stato ricevuto, e devono essere
267 opportunamente inizializzati; il primo deve contenere il puntatore alla
268 struttura (di tipo \ctyp{sockaddr}) che conterrà l'indirizzo e il secondo il
269 puntatore alla variabile con la dimensione di detta struttura. Si tenga
270 presente che mentre il contenuto della struttura \ctyp{sockaddr} cui punta
271 \param{from} può essere qualunque, la variabile puntata da \param{fromlen}
272 deve essere opportunamente inizializzata a \code{sizeof(sockaddr)},
273 assicurandosi che la dimensione sia sufficiente a contenere tutti i dati
274 dell'indirizzo.\footnote{si ricordi che \ctyp{sockaddr} è un tipo generico che
275   serve ad indicare la struttura corrispondente allo specifico tipo di
276   indirizzo richiesto, il valore di \param{fromlen} pone un limite alla
277   quantità di dati che verranno scritti sulla struttura puntata da
278   \param{from} e se è insufficiente l'indirizzo risulterà corrotto.}  Al
279 ritorno della funzione si otterranno i dati dell'indirizzo e la sua effettiva
280 lunghezza, (si noti che \param{fromlen} è un valore intero ottenuto come
281 \itindex{value~result~argument} \textit{value result argument}).  Se non si è
282 interessati a questa informazione, entrambi gli argomenti devono essere
283 inizializzati al valore \const{NULL}.
284
285 Una differenza fondamentale del comportamento di queste funzioni rispetto alle
286 usuali \func{read} e \func{write} che abbiamo usato con i socket TCP è che in
287 questo caso è perfettamente legale inviare con \func{sendto} un pacchetto
288 vuoto (che nel caso conterrà solo le intestazioni di IP e di UDP),
289 specificando un valore nullo per \param{len}. Allo stesso modo è possibile
290 ricevere con \func{recvfrom} un valore di ritorno di 0 byte, senza che questo
291 possa configurarsi come una chiusura della connessione\footnote{dato che la
292   connessione non esiste, non ha senso parlare di chiusura della connessione,
293   questo significa anche che con i socket UDP non è necessario usare
294   \func{close} o \func{shutdown} per terminare la comunicazione.} o come una
295 cessazione delle comunicazioni.
296
297
298
299 \subsection{Un client UDP elementare}
300 \label{sec:UDP_daytime_client}
301
302 Vediamo allora come implementare un primo client elementare con dei socket
303 UDP.  Ricalcando quanto fatto nel caso dei socket TCP prenderemo come primo
304 esempio l'uso del servizio \textit{daytime}, utilizzando questa volta UDP. Il
305 servizio è definito nell'\href{http://www.ietf.org/rfc/rfc0862.txt}{RFC~867},
306 che nel caso di uso di UDP prescrive che il client debba inviare un pacchetto
307 UDP al server (di contenuto non specificato), il quale risponderà a inviando a
308 sua volta un pacchetto UDP contenente la data.
309
310 \begin{figure}[!htb] 
311   \footnotesize \centering
312   \begin{minipage}[c]{15.6cm}
313     \includecodesample{listati/UDP_daytime.c}
314   \end{minipage} 
315   \normalsize
316   \caption{Sezione principale del client per il servizio \textit{daytime} su
317     UDP.}
318   \label{fig:UDP_daytime_client}
319 \end{figure}
320
321 In fig.~\ref{fig:UDP_daytime_client} è riportato la sezione principale del
322 codice del nostro client, il sorgente completo si trova nel file
323 \file{UDP\_daytime.c} distribuito con gli esempi allegati alla guida; al
324 solito si è tralasciato di riportare in figura la sezione relativa alla
325 gestione delle opzioni a riga di comando (nel caso praticamente assenti).
326
327 Il programma inizia (\texttt{\small 9--12}) con la creazione del socket, al
328 solito uscendo dopo aver stampato un messaggio in caso errore. Si noti come in
329 questo caso, rispetto all'analogo client basato su socket TCP di
330 fig.~\ref{fig:TCP_daytime_client_code} si sia usato per il tipo di socket il
331 valore \const{SOCK\_DGRAM}, pur mantenendosi nella stessa famiglia data da
332 \const{AF\_INET}.
333
334 Il passo successivo (\texttt{\small 13--21}) è l'inizializzazione della
335 struttura degli indirizzi; prima (\texttt{\small 14}) si cancella
336 completamente la stessa con \func{memset}, (\texttt{\small 15}) poi si imposta
337 la famiglia dell'indirizzo ed infine (\texttt{\small 16} la porta. Infine
338 (\texttt{\small 18--21}) si ricava l'indirizzo del server da contattare
339 dall'argomento passato a riga di comando, convertendolo con \func{inet\_pton}.
340 Si noti come questa sezione sia identica a quella del client TCP di
341 fig.~\ref{fig:TCP_daytime_client_code}, in quanto la determinazione dell'uso
342 di UDP al posto di TCP è stata effettuata quando si è creato il socket.
343
344 Una volta completate le inizializzazioni inizia il corpo principale del
345 programma, il primo passo è inviare, come richiesto dal protocollo, un
346 pacchetto al server. Questo lo si fa (\texttt{\small 16}) inviando un
347 pacchetto vuoto (si ricordi quanto detto in
348 sez.~\ref{sec:UDP_sendto_recvfrom}) con \func{sendto}, avendo cura di passare
349 un valore nullo per il puntatore al buffer e la lunghezza del messaggio. In
350 realtà il protocollo non richiede che il pacchetto sia vuoto, ma dato che il
351 server comunque ne ignorerà il contenuto, è inutile inviare dei dati.
352
353 Verificato (\texttt{\small 24--27}) che non ci siano stati errori nell'invio
354 si provvede (\texttt{\small 28}) ad invocare \func{recvfrom} per ricevere la
355 risposta del server. Si controlla poi (\texttt{\small 29--32}) che non vi
356 siano stati errori in ricezione (uscendo con un messaggio in caso contrario);
357 se è tutto a posto la variabile \var{nread} conterrà la dimensione del
358 messaggio di risposta inviato dal server che è stato memorizzato su
359 \var{buffer}, se (\texttt{\small 34}) pertanto il valore è positivo si
360 provvederà (\texttt{\small 35}) a terminare la stringa contenuta nel buffer di
361 lettura\footnote{si ricordi che, come illustrato in
362   sez.~\ref{sec:TCP_daytime_client}, il server invia in risposta una stringa
363   contenente la data, terminata dai due caratteri CR e LF, che pertanto prima
364   di essere stampata deve essere opportunamente terminata con un NUL.} e a
365 stamparla (\texttt{\small 36}) sullo standard output, controllando anche in
366 questo caso (\texttt{\small 36--38}) l'esito dell'operazione, ed uscendo con
367 un messaggio in caso di errore.
368
369 Se pertanto si è avuto cura di attivare il server del servizio
370 \textit{daytime}\footnote{di norma questo è un servizio standard fornito dal
371   \textsl{superdemone} \cmd{inetd}, per cui basta abilitarlo nel file di
372   configurazione di quest'ultimo, avendo cura di predisporre il servizio su
373   UDP.} potremo verificare il funzionamento del nostro client interrogando
374 quest'ultimo con:
375 \begin{verbatim}
376 [piccardi@gont sources]$ ./daytime 127.0.0.1
377 Sat Mar 20 23:17:13 2004
378 \end{verbatim}%$
379 ed osservando il traffico con uno sniffer potremo effettivamente vedere lo
380 scambio dei due pacchetti, quello vuoto di richiesta, e la risposta del
381 server:
382 \begin{verbatim}
383 [root@gont gapil]# tcpdump -i lo
384 tcpdump: listening on lo
385 23:41:21.645579 localhost.32780 > localhost.daytime: udp 0 (DF)
386 23:41:21.645710 localhost.daytime > localhost.32780: udp 26 (DF)
387 \end{verbatim}
388
389 Una differenza fondamentale del nostro client è che in questo caso, non
390 disponendo di una connessione, è per lui impossibile riconoscere errori di
391 invio relativi alla rete. La funzione \func{sendto} infatti riporta solo
392 errori locali, i dati vengono comunque scritti e la funzione ritorna senza
393 errori anche se il server non è raggiungibile o non esiste un server in
394 ascolto sull'indirizzo di destinazione. Questo comporta ad esempio che se si
395 usa il nostro programma interrogando un server inesistente questo resterà
396 perennemente bloccato nella chiamata a \func{recvfrom}, fin quando non lo
397 interromperemo. Vedremo in sez.~\ref{sec:UDP_connect} come si può porre rimedio
398 a questa problematica.
399
400
401 \subsection{Un server UDP elementare}
402 \label{sec:UDP_daytime_server}
403
404 Nella sezione precedente abbiamo visto come scrivere un client elementare per
405 servizio \textit{daytime}, vediamo in questa come deve essere scritto un
406 server.  Si ricordi che il compito di quest'ultimo è quello di ricevere un
407 pacchetto di richiesta ed inviare in risposta un pacchetto contenente una
408 stringa con la data corrente. 
409
410 \begin{figure}[!htb] 
411   \footnotesize \centering
412   \begin{minipage}[c]{15.6cm}
413     \includecodesample{listati/UDP_daytimed.c}
414   \end{minipage} 
415   \normalsize
416   \caption{Sezione principale del server per il servizio \textit{daytime} su
417     UDP.}
418   \label{fig:UDP_daytime_server}
419 \end{figure}
420
421 In fig.~\ref{fig:UDP_daytime_server} è riportato la sezione principale del
422 codice del nostro client, il sorgente completo si trova nel file
423 \file{UDP\_daytimed.c} distribuito con gli esempi allegati alla guida; anche
424 in questo caso si è omessa la sezione relativa alla gestione delle opzioni a
425 riga di comando (la sola presente è \texttt{-v} che permette di stampare a
426 video l'indirizzo associato ad ogni richiesta).
427
428 Anche in questo caso la prima parte del server (\texttt{\small 9--23}) è
429 sostanzialmente identica a quella dell'analogo server per TCP illustrato in
430 fig.~\ref{fig:TCP_daytime_cunc_server_code}; si inizia (\texttt{\small 10})
431 con il creare il socket, uscendo con un messaggio in caso di errore
432 (\texttt{\small 10--13}), e di nuovo la sola differenza con il caso precedente
433 è il diverso tipo di socket utilizzato. Dopo di che (\texttt{\small 14--18})
434 si inizializza la struttura degli indirizzi che poi (\texttt{\small 20}) verrà
435 usata da \func{bind}; si cancella (\texttt{\small 15}) preventivamente il
436 contenuto, si imposta (\texttt{\small 16}) la famiglia dell'indirizzo, la
437 porta (\texttt{\small 17}) e l'indirizzo (\texttt{\small 18}) su cui si
438 riceveranno i pacchetti.  Si noti come in quest'ultimo sia l'indirizzo
439 generico \const{INADDR\_ANY}; questo significa (si ricordi quanto illustrato
440 in sez.~\ref{sec:TCP_func_bind}) che il server accetterà pacchetti su uno
441 qualunque degli indirizzi presenti sulle interfacce di rete della macchina.
442
443 Completata l'inizializzazione tutto quello che resta da fare è eseguire
444 (\texttt{\small 20--23}) la chiamata a \func{bind}, controllando la presenza
445 di eventuali errori, ed uscendo con un avviso qualora questo fosse il caso.
446 Nel caso di socket UDP questo è tutto quello che serve per consentire al
447 server di ricevere i pacchetti a lui indirizzati, e non è più necessario
448 chiamare successivamente \func{listen}. In questo caso infatti non esiste il
449 concetto di connessione, e quindi non deve essere predisposta una coda delle
450 connessioni entranti. Nel caso di UDP i pacchetti arrivano al kernel con un
451 certo indirizzo ed una certa porta di destinazione, il kernel controlla se
452 corrispondono ad un socket che è stato \textsl{legato} ad essi con
453 \func{bind}, qualora questo sia il caso scriverà il contenuto all'interno del
454 socket, così che il programma possa leggerlo, altrimenti risponderà alla
455 macchina che ha inviato il pacchetto con un messaggio ICMP di tipo
456 \textit{port unreachable}.
457
458 Una volta completata la fase di inizializzazione inizia il corpo principale
459 (\texttt{\small 24--44}) del server, mantenuto all'interno di un ciclo
460 infinito in cui si trattano le richieste. Il ciclo inizia (\texttt{\small 26})
461 con una chiamata a \func{recvfrom}, che si bloccherà in attesa di pacchetti
462 inviati dai client. Lo scopo della funzione è quello di ritornare tutte le
463 volte che un pacchetto viene inviato al server, in modo da poter ricavare da
464 esso l'indirizzo del client a cui inviare la risposta in \var{addr}. Per
465 questo motivo in questo caso (al contrario di quanto fatto in
466 fig.~\ref{fig:UDP_daytime_client}) si è avuto cura di passare gli argomenti
467 \var{addr} e \var{len} alla funzione.  Dopo aver controllato (\texttt{\small
468   27--30}) la presenza di eventuali errori (uscendo con un messaggio di errore
469 qualora ve ne siano) si verifica (\texttt{\small 31}) se è stata attivata
470 l'opzione \texttt{-v} (che imposta la variabile \var{verbose}) stampando nel
471 caso (\texttt{\small 32--35}) l'indirizzo da cui si è appena ricevuto una
472 richiesta (questa sezione è identica a quella del server TCP illustrato in
473 fig.~\ref{fig:TCP_daytime_cunc_server_code}).
474
475 Una volta ricevuta la richiesta resta solo da ottenere il tempo corrente
476 (\texttt{\small 36}) e costruire (\texttt{\small 37}) la stringa di risposta,
477 che poi verrà inviata (\texttt{\small 38}) al client usando \func{sendto},
478 avendo al solito cura di controllare (\texttt{\small 40--42}) lo stato di
479 uscita della funzione e trattando opportunamente la condizione di errore.
480
481 Si noti come per le peculiarità del protocollo si sia utilizzato un server
482 iterativo, che processa le richieste una alla volta via via che gli arrivano.
483 Questa è una caratteristica comune dei server UDP, conseguenza diretta del
484 fatto che non esiste il concetto di connessione, per cui non c'è la necessità
485 di trattare separatamente le singole connessioni. Questo significa anche che è
486 il kernel a gestire la possibilità di richieste multiple in contemporanea;
487 quello che succede è semplicemente che il kernel accumula in un buffer in
488 ingresso i pacchetti UDP che arrivano e li restituisce al processo uno alla
489 volta per ciascuna chiamata di \func{recvfrom}; nel nostro caso sarà poi
490 compito del server distribuire le risposte sulla base dell'indirizzo da cui
491 provengono le richieste.
492
493
494 \subsection{Le problematiche dei socket UDP}
495 \label{sec:UDP_problems}
496
497 L'esempio del servizio \textit{daytime} illustrato nelle precedenti sezioni
498 è in realtà piuttosto particolare, e non evidenzia quali possono essere i
499 problemi collegati alla mancanza di affidabilità e all'assenza del concetto di
500 connessione che sono tipiche dei socket UDP. In tal caso infatti il protocollo
501 è estremamente semplice, dato che la comunicazione consiste sempre in una
502 richiesta seguita da una risposta, per uno scambio di dati effettuabile con un
503 singolo pacchetto, per cui tutti gli eventuali problemi sarebbero assai più
504 complessi da rilevare.
505
506 Anche qui però possiamo notare che se il pacchetto di richiesta del client, o
507 la risposta del server si perdono, il client resterà permanentemente bloccato
508 nella chiamata a \func{recvfrom}. Per evidenziare meglio quali problemi si
509 possono avere proviamo allora con un servizio leggermente più complesso come
510 \textit{echo}. 
511
512 \begin{figure}[!htb] 
513   \footnotesize \centering
514   \begin{minipage}[c]{15.6cm}
515     \includecodesample{listati/UDP_echo_first.c}
516   \end{minipage} 
517   \normalsize
518   \caption{Sezione principale della prima versione client per il servizio
519     \textit{echo} su UDP.}
520   \label{fig:UDP_echo_client}
521 \end{figure}
522
523 In fig.~\ref{fig:UDP_echo_client} è riportato un estratto del corpo principale
524 del nostro client elementare per il servizio \textit{echo} (al solito il
525 codice completo è con i sorgenti allegati). Le uniche differenze con l'analogo
526 client visto in fig.~\ref{fig:TCP_echo_client_1} sono che al solito si crea
527 (\texttt{\small 14}) un socket di tipo \const{SOCK\_DGRAM}, e che non è
528 presente nessuna chiamata a \func{connect}. Per il resto il funzionamento del
529 programma è identico, e tutto il lavoro viene effettuato attraverso la
530 chiamata (\texttt{\small 28}) alla funzione \func{ClientEcho} che stavolta
531 però prende un argomento in più, che è l'indirizzo del socket.
532
533 \begin{figure}[!htb] 
534   \footnotesize \centering
535   \begin{minipage}[c]{15.6cm}
536     \includecodesample{listati/UDP_ClientEcho_first.c}
537   \end{minipage}
538   \normalsize
539   \caption{Codice della funzione \func{ClientEcho} usata dal client per il
540     servizio \textit{echo} su UDP.}
541   \label{fig:UDP_echo_client_echo}
542 \end{figure}
543
544 Ovviamente in questo caso il funzionamento della funzione, il cui codice è
545 riportato in fig.~\ref{fig:UDP_echo_client_echo}, è completamente diverso
546 rispetto alla analoga del server TCP, e dato che non esiste una connessione
547 questa necessita anche di un terzo argomento, che è l'indirizzo del server cui
548 inviare i pacchetti.
549
550 Data l'assenza di una connessione come nel caso di TCP il meccanismo è molto
551 più semplice da gestire. Al solito si esegue un ciclo infinito (\texttt{\small
552   6--30}) che parte dalla lettura (\texttt{\small 7}) sul buffer di invio
553 \var{sendbuff} di una stringa dallo standard input, se la stringa è vuota
554 (\texttt{\small 7--9}), indicando che l'input è terminato, si ritorna
555 immediatamente causando anche la susseguente terminazione del programma.
556
557 Altrimenti si procede (\texttt{\small 10--11}) all'invio della stringa al
558 destinatario invocando \func{sendto}, utilizzando, oltre alla stringa appena
559 letta, gli argomenti passati nella chiamata a \func{ClientEcho}, ed in
560 particolare l'indirizzo del server che si è posto in \var{serv\_addr}; qualora
561 (\texttt{\small 12}) si riscontrasse un errore si provvederà al solito
562 (\texttt{\small 13--14}) ad uscire con un messaggio di errore.
563
564 Il passo immediatamente seguente (\texttt{\small 17}) l'invio è quello di
565 leggere l'eventuale risposta del server con \func{recvfrom}; si noti come in
566 questo caso si sia scelto di ignorare l'indirizzo dell'eventuale pacchetto di
567 risposta, controllando (\texttt{\small 18--21}) soltanto la presenza di un
568 errore (nel qual caso al solito si ritorna dopo la stampa di un adeguato
569 messaggio). Si noti anche come, rispetto all'analoga funzione
570 \func{ClientEcho} utilizzata nel client TCP illustrato in
571 sez.~\ref{sec:TCP_echo_client} non si sia controllato il caso di un messaggio
572 nullo, dato che, nel caso di socket UDP, questo non significa la terminazione
573 della comunicazione.
574
575 L'ultimo passo (\texttt{\small 17}) è quello di terminare opportunamente la
576 stringa di risposta nel relativo buffer per poi provvedere alla sua stampa
577 sullo standard output, eseguendo il solito controllo (ed eventuale uscita con
578 adeguato messaggio informativo) in caso di errore.
579
580 In genere fintanto che si esegue il nostro client in locale non sorgerà nessun
581 problema, se però si proverà ad eseguirlo attraverso un collegamento remoto
582 (nel caso dell'esempio seguente su una VPN, attraverso una ADSL abbastanza
583 congestionata) e in modalità non interattiva, la probabilità di perdere
584 qualche pacchetto aumenta, ed infatti, eseguendo il comando come:
585 \begin{verbatim}
586 [piccardi@gont sources]$ cat UDP_echo.c | ./echo 192.168.1.120
587 /* UDP_echo.c
588  *
589  * Copyright (C) 2004 Simone Piccardi
590 ...
591 ...
592 /*
593  * Include needed headers
594
595 \end{verbatim}%$
596 si otterrà che, dopo aver correttamente stampato alcune righe, il programma si
597 blocca completamente senza stampare più niente. Se al contempo si fosse tenuto
598 sotto controllo il traffico UDP diretto o proveniente dal servizio
599 \textit{echo} con \cmd{tcpdump} si sarebbe ottenuto:
600 \begin{verbatim}
601 [root@gont gapil]# tcpdump  \( dst port 7 or src port 7 \)
602 ...
603 ...
604 18:48:16.390255 gont.earthsea.ea.32788 > 192.168.1.120.echo: udp 4 (DF)
605 18:48:17.177613 192.168.1.120.echo > gont.earthsea.ea.32788: udp 4 (DF)
606 18:48:17.177790 gont.earthsea.ea.32788 > 192.168.1.120.echo: udp 26 (DF)
607 18:48:17.964917 192.168.1.120.echo > gont.earthsea.ea.32788: udp 26 (DF)
608 18:48:17.965408 gont.earthsea.ea.32788 > 192.168.1.120.echo: udp 4 (DF)
609 \end{verbatim}
610 che come si vede il traffico fra client e server si interrompe dopo l'invio di
611 un pacchetto UDP per il quale non si è ricevuto risposta.
612
613 Il problema è che in tutti i casi in cui un pacchetto di risposta si perde, o
614 una richiesta non arriva a destinazione, il nostro programma si bloccherà
615 nell'esecuzione di \func{recvfrom}. Lo stesso avviene anche se il server non è
616 in ascolto, in questo caso però, almeno dal punto di vista dello scambio di
617 pacchetti, il risultato è diverso, se si lancia al solito il programma e si
618 prova a scrivere qualcosa si avrà ugualmente un blocco su \func{recvfrom} ma
619 se si osserva il traffico con \cmd{tcpdump} si vedrà qualcosa del tipo:
620 \begin{verbatim}
621 [root@gont gapil]# tcpdump  \( dst 192.168.0.2 and src 192.168.1.120 \) \
622    or \( src 192.168.0.2 and dst 192.168.1.120 \)
623 tcpdump: listening on eth0
624 00:43:27.606944 gont.earthsea.ea.32789 > 192.168.1.120.echo: udp 6 (DF)
625 00:43:27.990560 192.168.1.120 > gont.earthsea.ea: icmp: 192.168.1.120 udp port 
626 echo unreachable [tos 0xc0]
627 \end{verbatim}
628 cioè in questo caso si avrà in risposta un pacchetto ICMP di destinazione
629 irraggiungibile che ci segnala che la porta in questione non risponde. 
630
631 Ci si può chiedere allora perché, benché la situazione di errore sia
632 rilevabile, questa non venga segnalata. Il luogo più naturale in cui
633 riportarla sarebbe la chiamata di \func{sendto}, in quanto è a causa dell'uso
634 di un indirizzo sbagliato che il pacchetto non può essere inviato; farlo in
635 questo punto però è impossibile, dato che l'interfaccia di programmazione
636 richiede che la funzione ritorni non appena il kernel invia il
637 pacchetto,\footnote{questo è il classico caso di \textsl{errore asincrono},
638   una situazione cioè in cui la condizione di errore viene rilevata in maniera
639   asincrona rispetto all'operazione che l'ha causata, una eventualità
640   piuttosto comune quando si ha a che fare con la rete, tutti i pacchetti ICMP
641   che segnalano errori rientrano in questa tipologia.} e non può bloccarsi in
642 una attesa di una risposta che potrebbe essere molto lunga (si noti infatti
643 che il pacchetto ICMP arriva qualche decimo di secondo più tardi) o non
644 esserci affatto.
645
646 Si potrebbe allora pensare di riportare l'errore nella \func{recvfrom} che è
647 comunque bloccata in attesa di una risposta che nel caso non arriverà mai.  La
648 ragione per cui non viene fatto è piuttosto sottile e viene spiegata da
649 Stevens in \cite{UNP2} con il seguente esempio: si consideri un client che
650 invia tre pacchetti a tre diverse macchine, due dei quali vengono regolarmente
651 ricevuti, mentre al terzo, non essendo presente un server sulla relativa
652 macchina, viene risposto con un messaggio ICMP come il precedente. Detto
653 messaggio conterrà anche le informazioni relative ad indirizzo e porta del
654 pacchetto che ha fallito, però tutto quello che il kernel può restituire al
655 programma è un codice di errore in \var{errno}, con il quale è impossibile di
656 distinguere per quale dei pacchetti inviati si è avuto l'errore; per questo è
657 stata fatta la scelta di non riportare un errore su un socket UDP, a meno che,
658 come vedremo in sez.~\ref{sec:UDP_connect}, questo non sia connesso.
659
660
661
662 \subsection{L'uso della funzione \func{connect} con i socket UDP}
663 \label{sec:UDP_connect}
664
665 Come illustrato in sez.~\ref{sec:UDP_characteristics} essendo i socket UDP
666 privi di connessione non è necessario per i client usare \func{connect} prima
667 di iniziare una comunicazione con un server. Ciò non di meno abbiamo accennato
668 come questa possa essere utilizzata per gestire la presenza di errori
669 asincroni.
670
671 Quando si chiama \func{connect} su di un socket UDP tutto quello che succede è
672 che l'indirizzo passato alla funzione viene registrato come indirizzo di
673 destinazione del socket. A differenza di quanto avviene con TCP non viene
674 scambiato nessun pacchetto, tutto quello che succede è che da quel momento in
675 qualunque cosa si scriva sul socket sarà inviata a quell'indirizzo; non sarà
676 più necessario usare l'argomento \param{to} di \func{sendto} per specificare
677 la destinazione dei pacchetti, che potranno essere inviati e ricevuti usando
678 le normali funzioni \func{read} e \func{write}.\footnote{in realtà si può
679   anche continuare ad usare la funzione \func{sendto}, ma in tal caso
680   l'argomento \param{to} deve essere inizializzato a \const{NULL}, e
681   \param{tolen} deve essere inizializzato a zero, pena un errore.}
682
683 Una volta che il socket è connesso cambia però anche il comportamento in
684 ricezione; prima infatti il kernel avrebbe restituito al socket qualunque
685 pacchetto ricevuto con un indirizzo di destinazione corrispondente a quello
686 del socket, senza nessun controllo sulla sorgente; una volta che il socket
687 viene connesso saranno riportati su di esso solo i pacchetti con un indirizzo
688 sorgente corrispondente a quello a cui ci si è connessi.
689
690 Infine quando si usa un socket connesso, venendo meno l'ambiguità segnalata
691 alla fine di sez.~\ref{sec:UDP_problems}, tutti gli eventuali errori asincroni
692 vengono riportati alle funzioni che operano su di esso; pertanto potremo
693 riscrivere il nostro client per il servizio \textit{echo} con le modifiche
694 illustrate in fig.~\ref{fig:UDP_echo_conn_cli}.
695
696 \begin{figure}[!htb] 
697   \footnotesize \centering
698   \begin{minipage}[c]{15.6cm}
699     \includecodesample{listati/UDP_echo.c}
700   \end{minipage}
701   \normalsize
702   \caption{Seconda versione del client del servizio \textit{echo} che utilizza
703     socket UDP connessi.}
704   \label{fig:UDP_echo_conn_cli}
705 \end{figure}
706
707 Ed in questo caso rispetto alla precedente versione, il solo cambiamento è
708 l'utilizzo (\texttt{\small 17}) della funzione \func{connect} prima della
709 chiamata alla funzione di gestione del protocollo, che a sua volta è stata
710 modificata eliminando l'indirizzo passato come argomento e sostituendo le
711 chiamata a \func{sendto} e \func{recvfrom} con chiamate a \func{read} e
712 \func{write} come illustrato dal nuovo codice riportato in
713 fig.~\ref{fig:UDP_echo_conn_echo_client}.
714
715 \begin{figure}[!htb] 
716   \footnotesize \centering
717   \begin{minipage}[c]{15.6cm}
718     \includecodesample{listati/UDP_ClientEcho.c}
719   \end{minipage}
720   \normalsize
721   \caption{Seconda versione della funzione \func{ClientEcho}.}
722   \label{fig:UDP_echo_conn_echo_client}
723 \end{figure}
724
725 Utilizzando questa nuova versione del client si può verificare che quando ci
726 si rivolge verso un indirizzo inesistente o su cui non è in ascolto un server
727 si è in grado rilevare l'errore, se infatti eseguiamo il nuovo programma
728 otterremo un qualcosa del tipo:
729 \begin{verbatim}
730 [piccardi@gont sources]$ ./echo 192.168.1.1
731 prova
732 Errore in lettura: Connection refused
733 \end{verbatim}%$
734
735 Ma si noti che a differenza di quanto avveniva con il client TCP qui l'errore
736 viene rilevato soltanto dopo che si è tentato di inviare qualcosa, ed in
737 corrispondenza al tentativo di lettura della risposta. Questo avviene perché
738 con UDP non esiste una connessione, e fintanto che non si invia un pacchetto
739 non c'è traffico sulla rete. In questo caso l'errore sarà rilevato alla
740 ricezione del pacchetto ICMP \textit{destination unreachable} emesso dalla
741 macchina cui ci si è rivolti, e questa volta, essendo il socket UDP connesso,
742 il kernel potrà riportare detto errore in user space in maniera non ambigua,
743 ed esso apparirà alla successiva lettura sul socket.
744
745 Si tenga presente infine che l'uso dei socket connessi non risolve l'altro
746 problema del client, e cioè il fatto che in caso di perdita di un pacchetto
747 questo resterà bloccato permanentemente in attesa di una risposta. Per
748 risolvere questo problema l'unico modo sarebbe quello di impostare un
749 \textit{timeout} o riscrivere il client in modo da usare l'I/O non bloccante.
750
751
752
753 \index{socket!locali|(}
754
755
756 \section{I socket \textit{Unix domain}}
757 \label{sec:unix_socket}
758
759 Benché i socket Unix domain, come meccanismo di comunicazione fra processi che
760 girano sulla stessa macchina, non siano strettamente attinenti alla rete, li
761 tratteremo comunque in questa sezione. Nonostante le loro peculiarità infatti,
762 l'interfaccia di programmazione che serve ad utilizzarli resta sempre quella
763 dei socket.
764
765
766
767 \subsection{Il passaggio di file descriptor}
768 \label{sec:sock_fd_passing}
769
770
771
772 \index{socket!locali|)}
773
774
775 \section{Altri socket}
776 \label{sec:socket_other}
777
778 Tratteremo in questa sezione gli altri tipi particolari di socket supportati
779 da Linux, come quelli relativi a particolare protocolli di trasmissione, i
780 socket \textit{netlink} che definiscono una interfaccia di comunicazione con
781 il kernel, ed i \textit{packet socket} che consentono di inviare pacchetti
782 direttamente a livello delle interfacce di rete. 
783
784 \subsection{I socket \textit{raw}}
785 \label{sec:socket_raw}
786
787 Tratteremo in questa sezione i cosiddetti \textit{raw socket}, con i quali si
788 possono \textsl{forgiare} direttamente i pacchetti a tutti i livelli dello
789 stack dei protocolli. 
790
791 \subsection{I socket \textit{netlink}}
792 \label{sec:socket_netlink}
793
794
795 \subsection{I \textit{packet socket}}
796 \label{sec:packet_socket}
797
798
799 % articoli interessanti:
800 % http://www.linuxjournal.com/article/5617
801 % http://www.linuxjournal.com/article/4659
802
803
804
805 % LocalWords:  socket cap TCP UDP domain sez NFS DNS stream datagram PF INET to
806 % LocalWords:  IPv tab SOCK DGRAM three way handshake client fig bind listen AF
807 % LocalWords:  accept recvfrom sendto connect netstat named DHCP kernel ICMP CR
808 % LocalWords:  port unreachable read write glibc Specification flags int BSD LF
809 % LocalWords:  libc unsigned len size tolen sys ssize sockfd const void buf MSG
810 % LocalWords:  struct sockaddr socklen errno EAGAIN ECONNRESET EDESTADDRREQ RFC
811 % LocalWords:  EISCONN EMSGSIZE ENOBUFS ENOTCONN EOPNOTSUPP EPIPE SIGPIPE EBADF
812 % LocalWords:  NOSIGNAL EFAULT EINVAL EINTR ENOMEM ENOTSOCK NULL fromlen from
813 % LocalWords:  ECONNREFUSED value result argument close shutdown daytime nell'
814 % LocalWords:  memset inet pton nread NUL superdemone inetd sniffer daytimed
815 % LocalWords:  INADDR ANY addr echo ClientEcho sendbuff serv VPN tcpdump l'I
816 % LocalWords:  Stevens destination descriptor raw stack netlink packet
817
818
819
820 %%% Local Variables: 
821 %%% mode: latex
822 %%% TeX-master: "gapil"
823 %%% End: