bda41602a653c4c52ec21755413eb974aaf9a2bf
[gapil.git] / socket.tex
1 %% socket.tex
2 %%
3 %% Copyright (C) 2000-2015 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{I socket}
13 \label{cha:socket_intro}
14
15 In questo capitolo inizieremo a spiegare le caratteristiche salienti della
16 principale interfaccia per la programmazione di rete, quella dei
17 \textit{socket}, che, pur essendo nata in ambiente Unix, è usata ormai da
18 tutti i sistemi operativi.
19
20 Dopo una breve panoramica sulle caratteristiche di questa interfaccia vedremo
21 come creare un socket e come collegarlo allo specifico protocollo di rete che
22 si utilizzerà per la comunicazione. Per evitare un'introduzione puramente
23 teorica concluderemo il capitolo con un primo esempio di applicazione.
24
25 \section{Introduzione ai socket}
26 \label{sec:sock_overview}
27
28 In questa sezione daremo descrizione essenziale di cosa sono i \textit{socket}
29 e di quali sono i concetti fondamentali da tenere presente quando si ha a che
30 fare con essi; ne illustreremo poi le caratteristiche e le differenti
31 tipologie presenti ed infine tratteremo le modalità con cui possono essere
32 creati.
33
34 \index{socket!definizione|(}
35
36 \subsection{Cosa sono \textit{socket}}
37 \label{sec:sock_socket_def}
38
39 I \textit{socket} (una traduzione letterale potrebbe essere \textsl{presa}, ma
40 essendo universalmente noti come \textit{socket} utilizzeremo sempre la parola
41 inglese) sono uno dei principali meccanismi di comunicazione utilizzato in
42 ambito Unix, e li abbiamo brevemente incontrati in
43 sez.~\ref{sec:ipc_socketpair}, fra i vari meccanismi di intercomunicazione fra
44 processi. 
45
46 Un socket costituisce in sostanza un canale di comunicazione fra due processi
47 su cui si possono leggere e scrivere dati analogo a quello di una
48 \textit{pipe} (vedi sez.~\ref{sec:ipc_pipes}) ma, a differenza di questa e
49 degli altri meccanismi esaminati nel capitolo cap.~\ref{cha:IPC}, i socket non
50 sono limitati alla comunicazione fra processi che girano sulla stessa
51 macchina, ma possono realizzare la comunicazione anche attraverso la rete.
52
53 Quella dei socket costituisce infatti la principale interfaccia usata nella
54 programmazione di rete.  La loro origine risale al 1983, quando furono
55 introdotti in BSD 4.2; l'interfaccia è rimasta sostanzialmente la stessa, con
56 piccole modifiche, negli anni successivi. Benché siano state sviluppate
57 interfacce alternative, originate dai sistemi SVr4 come la XTI (\textit{X/Open
58   Transport Interface}) nessuna ha mai raggiunto la diffusione e la popolarità
59 di quella dei socket (né tantomeno la stessa usabilità e flessibilità) ed oggi
60 sono praticamente dimenticate.
61
62 La flessibilità e la genericità dell'interfaccia inoltre consente di
63 utilizzare i socket con i più disparati meccanismi di comunicazione, e non
64 solo con l'insieme dei protocolli TCP/IP, anche se questa sarà comunque quella
65 di cui tratteremo in maniera più estesa.
66
67 Per capire il funzionamento dei socket occorre avere presente il funzionamento
68 dei protocolli di rete che su utilizzeranno (ed in particolare quelli del
69 TCP/IP già illustrati in sez.~\ref{sec:net_tpcip}), ma l'interfaccia è del
70 tutto generale e benché le problematiche, e quindi le modalità di risolvere i
71 problemi, siano diverse a seconda del tipo di protocollo di comunicazione
72 usato, le funzioni da usare nella gestione dei socket restano le stesse.
73
74 Per questo motivo una semplice descrizione dell'interfaccia è assolutamente
75 inutile, in quanto il comportamento di quest'ultima e le problematiche da
76 affrontare cambiano radicalmente a seconda del tipo di comunicazione usato.
77 La scelta di questo tipo di comunicazione (sovente anche detto \textsl{stile})
78 va infatti ad incidere sulla semantica che verrà utilizzata a livello utente
79 per gestire la comunicazione cioè su come inviare e ricevere i dati e sul
80 comportamento effettivo delle funzioni utilizzate.
81
82 La scelta di uno \textsl{stile} dipende sia dai meccanismi disponibili, sia
83 dal tipo di comunicazione che si vuole effettuare. Ad esempio alcuni tipi di
84 comunicazione considerano i dati come una sequenza continua di byte, in quello
85 che viene chiamato un \textsl{flusso} (in inglese \textit{stream}), mentre
86 altri invece li raggruppano in \textsl{pacchetti} (in inglese
87 \textit{datagram}) che vengono sempre inviati in blocchi separati e non
88 divisibili.
89
90 Un altro esempio delle differenze fra i diversi tipi di comunicazione concerne
91 la possibilità che essa possa o meno perdere dati nella trasmissione, che
92 possa o meno rispettare l'ordine in cui i dati inviati e ricevuti, o che possa
93 accadere di inviare dei pacchetti di dati più volte (differenze che ad esempio
94 sono presenti nel caso di utilizzo dei protocolli TCP o UDP).
95
96 Un terzo esempio di differenza nel tipo di comunicazione concerne il modo in
97 cui essa avviene nei confronti dei corrispondenti, in certi casi essa può
98 essere condotta con una connessione diretta con un solo corrispondente, come
99 per una telefonata; altri casi possono prevedere una comunicazione come per
100 lettera, in cui si scrive l'indirizzo su ogni pacchetto, altri ancora una
101 comunicazione uno a molti come il \textit{broadcast} ed il \textit{multicast},
102 in cui i pacchetti possono venire emessi su appositi ``\textsl{canali}'' dove
103 chiunque si collega possa riceverli.
104
105 É chiaro che ciascuno di questi diversi aspetti è associato ad un tipo di
106 comunicazione che comporta una modalità diversa di gestire la stessa, ad
107 esempio se la comunicazione è inaffidabile occorrerà essere in grado di
108 gestire la perdita o il rimescolamento dei dati, se è a pacchetti questi
109 dovranno essere opportunamente trattati, se è uno a molti occorrerà tener
110 conto della eventuale unidirezionalità della stessa, ecc.
111
112 \index{socket!definizione|)}
113
114
115 \subsection{La creazione di un socket}
116 \label{sec:sock_creation}
117
118 Come accennato l'interfaccia dei socket è estremamente flessibile e permette
119 di interagire con protocolli di comunicazione anche molto diversi fra di loro;
120 in questa sezione vedremo come è possibile creare un socket e come specificare
121 il tipo di comunicazione che esso deve utilizzare.
122
123 La creazione di un socket avviene attraverso l'uso della funzione di sistema 
124 \funcd{socket}; essa restituisce un \textit{file descriptor} (del tutto
125 analogo a quelli che si ottengono per i file di dati e le \textit{pipe},
126 descritti in sez.~\ref{sec:file_fd}) che serve come riferimento al socket; il
127 suo prototipo è:
128
129 \begin{funcproto}{
130 \fhead{sys/socket.h}
131 \fdecl{int socket(int domain, int type, int protocol)}
132 \fdesc{Apre un socket.} 
133 }
134
135 {La funzione ritorna un valore positivo in caso di successo e $-1$ per un
136   errore, nel qual caso \var{errno} assumerà uno dei valori:
137   \begin{errlist}
138   \item[\errcode{EACCES}] non si hanno privilegi per creare un socket nel
139     dominio o con il protocollo specificato.
140   \item[\errcode{EAFNOSUPPORT}] famiglia di indirizzi non supportata.
141   \item[\errcode{EINVAL}] argomento \param{type} invalido.
142   \item[\errcode{EMFILE}] si è ecceduta la tabella dei file.
143   \item[\errcode{ENFILE}] si è raggiunto il limite massimo di file aperti.
144   \item[\errcode{ENOBUFS}] non c'è sufficiente memoria per creare il socket
145     (può essere anche \errval{ENOMEM}).
146   \item[\errcode{EPROTONOSUPPORT}] il tipo di socket o il protocollo scelto
147     non sono supportati nel dominio.
148   \end{errlist}
149   ed inoltre a seconda del protocollo usato, potranno essere generati altri
150   errori, che sono riportati nelle pagine di manuale relative al protocollo.}
151 \end{funcproto}
152
153
154 La funzione ha tre argomenti, \param{domain} specifica il dominio del socket
155 (definisce cioè, come vedremo in sez.~\ref{sec:sock_domain}, la famiglia di
156 protocolli usata), \param{type} specifica il tipo di socket (definisce cioè,
157 come vedremo in sez.~\ref{sec:sock_type}, lo stile di comunicazione) e
158 \param{protocol} il protocollo; in genere quest'ultimo è indicato
159 implicitamente dal tipo di socket, per cui di norma questo valore viene messo
160 a zero (con l'eccezione dei \textit{raw socket}).
161
162 % TODO: l'ultimo argomento viene usato anche dai nuovi ping socket introdotti
163 % con il kernel 3.0, vedi anche http://lwn.net/Articles/420799/ e
164 % http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=c319b4d76b9e583a5d88d6bf190e079c4e43213d 
165
166 Si noti che la creazione del socket si limita ad allocare le opportune
167 strutture nel kernel (sostanzialmente una voce nella \textit{file table}) e
168 non comporta nulla riguardo all'indicazione degli indirizzi remoti o locali
169 attraverso i quali si vuole effettuare la comunicazione. Questo significa che
170 la funzione da sola non è in grado di fornire alcun tipo di comunicazione. 
171
172
173 \subsection{Il dominio dei socket}
174 \label{sec:sock_domain}
175
176 Dati i tanti e diversi protocolli di comunicazione disponibili, esistono vari
177 tipi di socket, che vengono classificati raggruppandoli in quelli che si
178 chiamano \textsl{domini}.  La scelta di un dominio equivale in sostanza alla
179 scelta di una famiglia di protocolli, e viene effettuata attraverso
180 l'argomento \param{domain} della funzione \func{socket}. Ciascun dominio ha un
181 suo nome simbolico che convenzionalmente è indicato da una costante che inizia
182 per \texttt{PF\_}, sigla che sta per \textit{protocol family}, altro nome con
183 cui si indicano i domini.
184
185 A ciascun tipo di dominio corrisponde un analogo nome simbolico, anch'esso
186 associato ad una costante, che inizia invece per \texttt{AF\_} (da
187 \textit{address family}) che identifica il formato degli indirizzi usati in
188 quel dominio. Le pagine di manuale di Linux si riferiscono a questi indirizzi
189 anche come \textit{name space}, (nome che invece il manuale delle \acr{glibc}
190 riserva a quello che noi abbiamo chiamato domini) dato che identificano il
191 formato degli indirizzi usati in quel dominio per identificare i capi della
192 comunicazione.
193
194 \begin{table}[htb]
195   \footnotesize
196   \centering
197   \begin{tabular}[c]{|l|l|l|l|}
198        \hline
199        \textbf{Nome}&\textbf{Valore}&\textbf{Utilizzo}&\textbf{Man page} \\
200        \hline
201        \hline
202        \const{PF\_UNSPEC}   & 0& Non specificato               &            \\
203        \const{PF\_LOCAL}    & 1& Local communication           & unix(7)    \\
204        \const{PF\_UNIX}, \const{PF\_FILE}&1&Sinonimi di \const{PF\_LOCAL}& \\
205        \const{PF\_INET}     & 2& IPv4 Internet protocols       & ip(7)      \\
206        \const{PF\_AX25}     & 3& Amateur radio AX.25 protocol  &            \\
207        \const{PF\_IPX}      & 4& IPX - Novell protocols        &            \\
208        \const{PF\_APPLETALK}& 5& Appletalk                     & ddp(7)     \\
209        \const{PF\_NETROM}   & 6& Amateur radio NetROM          &            \\
210        \const{PF\_BRIDGE}   & 7& Multiprotocol bridge          &            \\
211        \const{PF\_ATMPVC}   & 8& Access to raw ATM PVCs        &            \\
212        \const{PF\_X25}      & 9& ITU-T X.25 / ISO-8208 protocol& x25(7)     \\
213        \const{PF\_INET6}    &10& IPv6 Internet protocols       & ipv6(7)    \\
214        \const{PF\_ROSE}     &11& Amateur Radio X.25 PLP        &            \\
215        \const{PF\_DECnet}   &12& Reserved for DECnet project   &            \\
216        \const{PF\_NETBEUI}  &13& Reserved for 802.2LLC project &            \\
217        \const{PF\_SECURITY} &14& Security callback pseudo AF   &            \\
218        \const{PF\_KEY}      &15& PF\_KEY key management API    &            \\
219        \const{PF\_NETLINK}  &16& Kernel user interface device  & netlink(7) \\
220        \const{PF\_ROUTE}    &16& Sinonimo di \const{PF\_NETLINK} emula BSD.&\\
221        \const{PF\_PACKET}   &17& Low level packet interface    & packet(7)  \\
222        \const{PF\_ASH}      &18& Ash                           &    \\
223        \const{PF\_ECONET}   &19& Acorn Econet                  &    \\
224        \const{PF\_ATMSVC}   &20& ATM SVCs                      &    \\
225        \const{PF\_SNA}      &22& Linux SNA Project             &    \\
226        \const{PF\_IRDA}     &23& IRDA socket (infrarossi)      &    \\
227        \const{PF\_PPPOX}    &24& PPPoX socket                  &    \\
228        \const{PF\_WANPIPE}  &25& Wanpipe API socket            &    \\
229        \const{PF\_LLC}      &26& Linux LLC                     &    \\
230        \const{PF\_CAN}      &29& Controller Are network        &    \\
231        \const{PF\_BLUETOOTH}&31& Bluetooth socket              &    \\
232        \hline
233   \end{tabular}
234   \caption{Famiglie di protocolli definiti in Linux.} 
235   \label{tab:net_pf_names}
236 \end{table}
237
238 % TODO aggiungere PF_CAN, vedi http://lwn.net/Articles/253425, dal 2.6.25
239
240 L'idea alla base della distinzione fra questi due insiemi di costanti era che
241 una famiglia di protocolli potesse supportare vari tipi di indirizzi, per cui
242 il prefisso \texttt{PF\_} si sarebbe dovuto usare nella creazione dei socket e
243 il prefisso \texttt{AF\_} in quello delle strutture degli indirizzi. Questo è
244 quanto specificato anche dallo standard POSIX.1g, ma non esistono a tuttora
245 famiglie di protocolli che supportino diverse strutture di indirizzi, per cui
246 nella pratica questi due nomi sono equivalenti e corrispondono agli stessi
247 valori numerici.\footnote{in Linux, come si può verificare andando a guardare
248   il contenuto di \file{bits/socket.h}, le costanti sono esattamente le stesse
249   e ciascuna \texttt{AF\_} è definita alla corrispondente \texttt{PF\_} e con
250   lo stesso nome.} Qui si sono indicati i nomi con il prefisso \texttt{AF\_}
251 seguendo la convenzione usata nelle pagine di manuale.
252
253 I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di
254 indirizzi, sono definiti dall'\textit{header file} \headfile{socket.h}. Un
255 elenco delle famiglie di protocolli disponibili in Linux è riportato in
256 tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra
257 questi però saranno utilizzabili solo quelli per i quali si è compilato il
258 supporto nel kernel (o si sono caricati gli opportuni moduli), viene definita
259 anche una costante \const{PF\_MAX} che indica il valore massimo associabile ad
260 un dominio. 
261
262 Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili
263 dall'utente generico, ad esempio in generale tutti i socket di tipo
264 \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi
265 di amministratore (cioè con \ids{UID} effettivo uguale a zero) o dotati della
266 \textit{capability} \const{CAP\_NET\_RAW}.
267
268
269 \subsection{Il tipo di socket}
270 \label{sec:sock_type}
271
272 La scelta di un dominio non comporta però la scelta dello stile di
273 comunicazione, questo infatti viene a dipendere dal protocollo che si andrà ad
274 utilizzare fra quelli disponibili nella famiglia scelta. L'interfaccia dei
275 socket permette di scegliere lo stile di comunicazione indicando il tipo di
276 socket con l'argomento \param{type} di \func{socket}. Linux mette a
277 disposizione vari tipi di socket (che corrispondono a quelli che il manuale
278 della \acr{glibc} \cite{GlibcMan} chiama \textit{styles}) identificati dalle
279 seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi
280   tre tipi, Linux supporta anche gli altri, come si può verificare nel file
281   \texttt{include/linux/net.h} dei sorgenti del kernel.}
282
283 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
284 \item[\const{SOCK\_STREAM}] Provvede un canale di trasmissione dati
285   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
286   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
287   byte (da cui il nome \textit{stream}) e possono essere letti in blocchi di
288   dimensioni qualunque. Può supportare la trasmissione dei cosiddetti dati
289   urgenti (o \itindex{out-of-band} \textit{out-of-band}, vedi
290   sez.~\ref{sec:TCP_urgent_data}).
291 \item[\const{SOCK\_DGRAM}] Viene usato per trasmettere pacchetti di dati
292   (\textit{datagram}) di lunghezza massima prefissata, indirizzati
293   singolarmente. Non esiste una connessione e la trasmissione è effettuata in
294   maniera non affidabile.
295 \item[\const{SOCK\_SEQPACKET}] Provvede un canale di trasmissione di dati
296   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
297   altro socket. I dati possono vengono trasmessi per pacchetti di dimensione
298   massima fissata, e devono essere letti integralmente da ciascuna chiamata a
299   \func{read}.
300 \item[\const{SOCK\_RAW}] Provvede l'accesso a basso livello ai protocolli di
301   rete e alle varie interfacce. I normali programmi di comunicazione non
302   devono usarlo, è riservato all'uso di sistema.
303 \item[\const{SOCK\_RDM}] Provvede un canale di trasmissione di dati
304   affidabile, ma in cui non è garantito l'ordine di arrivo dei pacchetti.
305 \item[\const{SOCK\_PACKET}] Obsoleto, non deve essere più usato (e pertanto
306   non ne parleremo ulteriormente).
307 \end{basedescript}
308
309 A partire dal kernel 2.6.27 l'argomento \param{type} della funzione
310 \func{socket} assume un significato ulteriore perché può essere utlizzato per
311 impostare dei flag relativi alle caratteristiche generali del \textit{socket}
312 non strettamente attinenti all'indicazione del tipo secondo i valori appena
313 illustrati. Essi infatti possono essere combinati con un OR aritmetico delle
314 ulteriori costanti:
315 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
316 \item[\const{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul
317   file descriptor del socket, ottenendo lo stesso effetto del flag
318   \const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}),
319   di cui costituisce l'analogo.
320
321 \item[\const{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con
322   effetti identici ad una successiva chiamata a \func{fcntl} per impostare il
323   flag di \const{O\_NONBLOCK} sul file descriptor (si faccia di nuovo
324   riferimenti al significato di quest'ultimo come spiegato in
325   tab.~\ref{tab:open_operation_flag}).
326 \end{basedescript}
327
328
329 Si tenga presente inoltre che non tutte le combinazioni fra una famiglia di
330 protocolli e un tipo di socket sono valide, in quanto non è detto che in una
331 famiglia esista un protocollo per ciascuno dei diversi stili di comunicazione
332 appena elencati.
333
334 \begin{table}[htb]
335   \footnotesize
336   \centering
337   \begin{tabular}{|l|c|c|c|c|c|}
338     \hline
339     \multicolumn{1}{|c|}{\textbf{Famiglia}}&
340     \multicolumn{5}{|c|}{\textbf{Tipo}}\\
341     \hline
342     \hline
343     &\const{SOCK\_STREAM} &\const{SOCK\_DGRAM}     &\const{SOCK\_RAW}& 
344       \const{SOCK\_RDM}&\const{SOCK\_SEQPACKET} \\
345      \hline
346     \const{PF\_LOCAL}     &  si & si  &      &     &     \\
347      \hline
348 %    \const{PF\_UNIX}&\multicolumn{5}{|l|}{sinonimo di \const{PF\_LOCAL}.}\\
349 %     \hline
350     \const{PF\_INET}      & TCP & UDP & IPv4 &     &     \\
351      \hline
352     \const{PF\_INET6}     & TCP & UDP & IPv6 &     &     \\
353      \hline
354     \const{PF\_IPX}       &     &     &      &     &     \\
355      \hline
356     \const{PF\_NETLINK}   &     &  si &  si  &     &     \\
357      \hline
358     \const{PF\_X25}       &     &     &      &     &  si \\
359      \hline
360     \const{PF\_AX25}      &     &     &      &     &     \\
361      \hline
362     \const{PF\_ATMPVC}    &     &     &      &     &     \\
363      \hline
364     \const{PF\_APPLETALK} &     & si  &  si  &     &     \\
365      \hline
366     \const{PF\_PACKET}    &     & si  & si   &     &     \\    
367      \hline
368   \end{tabular}
369   \caption{Combinazioni valide di dominio e tipo di protocollo per la 
370     funzione \func{socket}.}
371   \label{tab:sock_sock_valid_combinations}
372 \end{table}
373
374 In tab.~\ref{tab:sock_sock_valid_combinations} sono mostrate le combinazioni
375 valide possibili per le principali famiglie di protocolli. Per ogni
376 combinazione valida si è indicato il tipo di protocollo, o la parola
377 \textsl{si} qualora non il protocollo non abbia un nome definito, mentre si
378 sono lasciate vuote le caselle per le combinazioni non supportate.
379
380
381 \section{Le strutture degli indirizzi dei socket}
382 \label{sec:sock_sockaddr}
383
384 Come si è visto nella creazione di un socket non si specifica nulla oltre al
385 tipo di famiglia di protocolli che si vuole utilizzare, in particolare nessun
386 indirizzo che identifichi i due capi della comunicazione. La funzione infatti
387 si limita ad allocare nel kernel quanto necessario per poter poi realizzare la
388 comunicazione.
389
390 Gli indirizzi infatti vengono specificati attraverso apposite strutture che
391 vengono utilizzate dalle altre funzioni della interfaccia dei socket, quando
392 la comunicazione viene effettivamente realizzata.  Ogni famiglia di protocolli
393 ha ovviamente una sua forma di indirizzamento e in corrispondenza a questa una
394 sua peculiare struttura degli indirizzi. I nomi di tutte queste strutture
395 iniziano per \var{sockaddr\_}; quelli propri di ciascuna famiglia vengono
396 identificati dal suffisso finale, aggiunto al nome precedente.
397
398
399 \subsection{La struttura generica}
400 \label{sec:sock_sa_gen}
401
402 Le strutture degli indirizzi vengono sempre passate alle varie funzioni
403 attraverso puntatori (cioè \textit{by reference}), ma le funzioni devono poter
404 maneggiare puntatori a strutture relative a tutti gli indirizzi possibili
405 nelle varie famiglie di protocolli; questo pone il problema di come passare
406 questi puntatori, il C moderno risolve questo problema coi i puntatori
407 generici (i \ctyp{void *}), ma l'interfaccia dei socket è antecedente alla
408 definizione dello standard ANSI C, e per questo nel 1982 fu scelto di definire
409 una struttura generica per gli indirizzi dei socket, \struct{sockaddr}, che si
410 è riportata in fig.~\ref{fig:sock_sa_gen_struct}.
411
412 \begin{figure}[!htb]
413   \footnotesize \centering
414   \begin{minipage}[c]{0.80\textwidth}
415     \includestruct{listati/sockaddr.h}
416   \end{minipage} 
417   \caption{La struttura generica degli indirizzi dei socket
418     \structd{sockaddr}.} 
419   \label{fig:sock_sa_gen_struct}
420 \end{figure}
421
422 Tutte le funzioni dei socket che usano gli indirizzi sono definite usando nel
423 prototipo un puntatore a questa struttura; per questo motivo quando si
424 invocano dette funzioni passando l'indirizzo di un protocollo specifico
425 occorrerà eseguire una conversione del relativo puntatore.
426
427 I tipi di dati che compongono la struttura sono stabiliti dallo standard
428 POSIX.1g e li abbiamo riassunti in tab.~\ref{tab:sock_data_types} con i
429 rispettivi file di include in cui sono definiti; la struttura è invece
430 definita nell'include file \headfile{sys/socket.h}.
431
432 \begin{table}[!htb]
433   \centering
434   \footnotesize
435   \begin{tabular}{|l|l|l|}
436     \hline
437     \multicolumn{1}{|c|}{\textbf{Tipo}}& 
438     \multicolumn{1}{|c|}{\textbf{Descrizione}}& 
439     \multicolumn{1}{|c|}{\textbf{Header}} \\
440     \hline
441     \hline
442     \type{int8\_t}   & intero a 8 bit con segno   & \headfile{sys/types.h}\\
443     \type{uint8\_t}  & intero a 8 bit senza segno & \headfile{sys/types.h}\\
444     \type{int16\_t}  & intero a 16 bit con segno  & \headfile{sys/types.h}\\
445     \type{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
446     \type{int32\_t}  & intero a 32 bit con segno  & \headfile{sys/types.h}\\
447     \type{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
448     \hline
449     \type{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
450     \type{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
451     un socket& \headfile{sys/socket.h}\\
452     \hline
453     \type{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) & 
454     \headfile{netinet/in.h}\\
455     \type{in\_port\_t} & porta TCP o UDP (\type{uint16\_t})& 
456     \headfile{netinet/in.h}\\
457     \hline
458   \end{tabular}
459   \caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto 
460     stabilito dallo standard POSIX.1g.}
461   \label{tab:sock_data_types}
462 \end{table}
463
464 In alcuni sistemi la struttura è leggermente diversa e prevede un primo membro
465 aggiuntivo \code{uint8\_t sin\_len} (come riportato da R. Stevens in
466 \cite{UNP1}). Questo campo non verrebbe usato direttamente dal programmatore e
467 non è richiesto dallo standard POSIX.1g, in Linux pertanto non esiste. Il
468 campo \type{sa\_family\_t} era storicamente un \ctyp{unsigned short}.
469
470 Dal punto di vista del programmatore l'unico uso di questa struttura è quello
471 di fare da riferimento per il casting, per il kernel le cose sono un po'
472 diverse, in quanto esso usa il puntatore per recuperare il campo
473 \var{sa\_family}, comune a tutte le famiglie, con cui determinare il tipo di
474 indirizzo; per questo motivo, anche se l'uso di un puntatore \ctyp{void *}
475 sarebbe più immediato per l'utente (che non dovrebbe più eseguire il casting),
476 è stato mantenuto l'uso di questa struttura.
477
478
479 \subsection{La struttura degli indirizzi IPv4}
480 \label{sec:sock_sa_ipv4}
481
482 I socket di tipo \const{PF\_INET} vengono usati per la comunicazione
483 attraverso internet; la struttura per gli indirizzi per un socket internet (se
484 si usa IPv4) è definita come \struct{sockaddr\_in} nell'header file
485 \headfile{netinet/in.h} ed ha la forma mostrata in
486 fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g.
487
488 \begin{figure}[!htb]
489   \footnotesize\centering
490   \begin{minipage}[c]{0.80\textwidth}
491     \includestruct{listati/sockaddr_in.h}
492   \end{minipage} 
493   \caption{La struttura \structd{sockaddr\_in} degli indirizzi dei socket
494     internet (IPv4) e la struttura \structd{in\_addr} degli indirizzi IPv4.}
495   \label{fig:sock_sa_ipv4_struct}
496 \end{figure}
497
498 L'indirizzo di un socket internet (secondo IPv4) comprende l'indirizzo
499 internet di un'interfaccia più un \textsl{numero di porta} (affronteremo in
500 dettaglio il significato di questi numeri in sez.~\ref{sec:TCP_port_num}).  Il
501 protocollo IP non prevede numeri di porta, che sono utilizzati solo dai
502 protocolli di livello superiore come TCP e UDP. Questa struttura però viene
503 usata anche per i socket RAW che accedono direttamente al livello di IP, nel
504 qual caso il numero della porta viene impostato al numero di protocollo.
505
506 Il membro \var{sin\_family} deve essere sempre impostato a \const{AF\_INET},
507 altrimenti si avrà un errore di \errcode{EINVAL}; il membro \var{sin\_port}
508 specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono
509 chiamati \textsl{riservati} in quanto utilizzati da servizi standard e
510 soltanto processi con i privilegi di amministratore (con \ids{UID} effettivo
511 uguale a zero) o con la \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}
512 possono usare la funzione \func{bind} (che vedremo in
513 sez.~\ref{sec:TCP_func_bind}) su queste porte.
514
515 Il membro \var{sin\_addr} contiene un indirizzo internet, e viene acceduto sia
516 come struttura (un resto di una implementazione precedente in cui questa era
517 una \direct{union} usata per accedere alle diverse classi di indirizzi) che
518 direttamente come intero. In \headfile{netinet/in.h} vengono definite anche
519 alcune costanti che identificano alcuni indirizzi speciali, riportati in
520 tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
521
522 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
523 essere specificati in quello che viene chiamato \textit{network order}, cioè
524 con i bit ordinati in formato \textit{big endian} (vedi
525 sez.~\ref{sec:endianness}), questo comporta la necessità di usare apposite
526 funzioni di conversione per mantenere la portabilità del codice (vedi
527 sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
528 soluzioni).
529
530
531 \subsection{La struttura degli indirizzi IPv6}
532 \label{sec:sock_sa_ipv6}
533
534 Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{PF\_INET6} sono
535 sostanzialmente identici ai precedenti; la parte in cui si trovano
536 praticamente tutte le differenze fra i due socket è quella della struttura
537 degli indirizzi; la sua definizione, presa da \headfile{netinet/in.h}, è
538 riportata in fig.~\ref{fig:sock_sa_ipv6_struct}.
539
540 \begin{figure}[!htb]
541   \footnotesize \centering
542   \begin{minipage}[c]{0.80\textwidth}
543     \includestruct{listati/sockaddr_in6.h}
544   \end{minipage} 
545   \caption{La struttura \structd{sockaddr\_in6} degli indirizzi dei socket
546     IPv6 e la struttura \structd{in6\_addr} degli indirizzi IPv6.}
547   \label{fig:sock_sa_ipv6_struct}
548 \end{figure}
549
550 Il campo \var{sin6\_family} deve essere sempre impostato ad \const{AF\_INET6},
551 il campo \var{sin6\_port} è analogo a quello di IPv4 e segue le stesse regole;
552 il campo \var{sin6\_flowinfo} è a sua volta diviso in tre parti di cui i 24
553 bit inferiori indicano l'etichetta di flusso, i successivi 4 bit la priorità e
554 gli ultimi 4 sono riservati. Questi valori fanno riferimento ad alcuni campi
555 specifici dell'header dei pacchetti IPv6 (vedi sez.~\ref{sec:IP_ipv6head}) ed
556 il loro uso è sperimentale.
557
558 Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
559 espresso da un vettore di 16 byte. Infine il campo \var{sin6\_scope\_id} è un
560 campo introdotto in Linux con il kernel 2.4, per gestire alcune operazioni
561 riguardanti il \textit{multicasting}.  Si noti infine che
562 \struct{sockaddr\_in6} ha una dimensione maggiore della struttura
563 \struct{sockaddr} generica di fig.~\ref{fig:sock_sa_gen_struct}, quindi
564 occorre stare attenti a non avere fatto assunzioni riguardo alla possibilità
565 di contenere i dati nelle dimensioni di quest'ultima.
566
567
568 \subsection{La struttura degli indirizzi locali}
569 \label{sec:sock_sa_local}
570
571 I socket di tipo \const{PF\_UNIX} o \const{PF\_LOCAL} vengono usati per una
572 comunicazione fra processi che stanno sulla stessa macchina (per questo
573 vengono chiamati \textit{local domain} o anche \textit{Unix domain}); essi
574 hanno la caratteristica ulteriore di poter essere creati anche in maniera
575 anonima attraverso la funzione \func{socketpair} (che abbiamo trattato in
576 sez.~\ref{sec:ipc_socketpair}).  Quando però si vuole fare riferimento
577 esplicito ad uno di questi socket si deve usare una struttura degli indirizzi
578 di tipo \struct{sockaddr\_un}, la cui definizione si è riportata in
579 fig.~\ref{fig:sock_sa_local_struct}.
580
581 \begin{figure}[!htb]
582   \footnotesize \centering
583   \begin{minipage}[c]{0.80\textwidth}
584     \includestruct{listati/sockaddr_un.h}
585   \end{minipage} 
586   \caption{La struttura \structd{sockaddr\_un} degli indirizzi dei socket
587     locali (detti anche \textit{unix domain}) definita in
588     \headfile{sys/un.h}.}
589   \label{fig:sock_sa_local_struct}
590 \end{figure}
591
592 In questo caso il campo \var{sun\_family} deve essere \const{AF\_UNIX}, mentre
593 il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due forme;
594 può essere un file (di tipo socket) nel filesystem o una stringa univoca
595 (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
596 specificato come una stringa (terminata da uno zero) corrispondente al
597 \textit{pathname} del file; nel secondo invece \var{sun\_path} inizia con uno
598 zero e vengono usati come nome i restanti byte come stringa, senza
599 terminazione.
600
601
602 \subsection{La struttura degli indirizzi AppleTalk}
603 \label{sec:sock_sa_appletalk}
604
605 I socket di tipo \const{PF\_APPLETALK} sono usati dalla libreria
606 \file{netatalk} per implementare la comunicazione secondo il protocollo
607 AppleTalk, uno dei primi protocolli di rete usato nel mondo dei personal
608 computer, usato dalla Apple per connettere fra loro computer e stampanti. Il
609 kernel supporta solo due strati del protocollo, DDP e AARP, e di norma è
610 opportuno usare le funzioni della libreria \texttt{netatalk}, tratteremo qui
611 questo argomento principalmente per mostrare l'uso di un protocollo
612 alternativo.
613
614 I socket AppleTalk permettono di usare il protocollo DDP, che è un protocollo
615 a pacchetto, di tipo \const{SOCK\_DGRAM}; l'argomento \param{protocol} di
616 \func{socket} deve essere nullo. È altresì possibile usare i socket raw
617 specificando un tipo \const{SOCK\_RAW}, nel qual caso l'unico valore valido
618 per \param{protocol} è \const{ATPROTO\_DDP}.
619
620 Gli indirizzi AppleTalk devono essere specificati tramite una struttura
621 \struct{sockaddr\_atalk}, la cui definizione è riportata in
622 fig.~\ref{fig:sock_sa_atalk_struct}; la struttura viene dichiarata includendo
623 il file \headfile{netatalk/at.h}.
624
625 \begin{figure}[!htb]
626   \footnotesize \centering
627   \begin{minipage}[c]{0.80\textwidth}
628     \includestruct{listati/sockaddr_atalk.h}
629   \end{minipage} 
630   \caption{La struttura \structd{sockaddr\_atalk} degli indirizzi dei socket
631     AppleTalk, e la struttura \structd{at\_addr} degli indirizzi AppleTalk.}
632   \label{fig:sock_sa_atalk_struct}
633 \end{figure}
634
635 Il campo \var{sat\_family} deve essere sempre \const{AF\_APPLETALK}, mentre il
636 campo \var{sat\_port} specifica la porta che identifica i vari servizi. Valori
637 inferiori a 129 sono usati per le \textsl{porte riservate}, e possono essere
638 usati solo da processi con i privilegi di amministratore o con la
639 \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}.  L'indirizzo remoto è
640 specificato nella struttura \var{sat\_addr}, e deve essere in \textit{network
641   order} (vedi sez.~\ref{sec:endianness}); esso è composto da un parte di
642 rete data dal campo \var{s\_net}, che può assumere il valore
643 \const{AT\_ANYNET}, che indica una rete generica e vale anche per indicare la
644 rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e può prendere
645 il valore generico \const{AT\_ANYNODE} che indica anche il nodo corrente, ed
646 il valore \const{ATADDR\_BCAST} che indica tutti i nodi della rete.
647
648
649 \subsection{La struttura degli indirizzi dei \textit{packet socket}}
650 \label{sec:sock_sa_packet}
651
652 I \textit{packet socket}, identificati dal dominio \const{PF\_PACKET}, sono
653 un'interfaccia specifica di Linux per inviare e ricevere pacchetti
654 direttamente su un'interfaccia di rete, senza passare per le funzioni di
655 gestione dei protocolli di livello superiore. In questo modo è possibile
656 implementare dei protocolli in user space, agendo direttamente sul livello
657 fisico. In genere comunque si preferisce usare la libreria
658 \file{pcap},\footnote{la libreria è mantenuta insieme al comando
659   \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del
660   progetto \url{http://www.tcpdump.org/}.}  che assicura la portabilità su
661 altre piattaforme, anche se con funzionalità ridotte.
662
663 Questi socket possono essere di tipo \const{SOCK\_RAW} o \const{SOCK\_DGRAM}.
664 Con socket di tipo \const{SOCK\_RAW} si può operare sul livello di
665 collegamento, ed i pacchetti vengono passati direttamente dal socket al driver
666 del dispositivo e viceversa.  In questo modo, in fase di trasmissione, il
667 contenuto completo dei pacchetti, comprese le varie intestazioni, deve essere
668 fornito dall'utente. In fase di ricezione invece tutto il contenuto del
669 pacchetto viene passato inalterato sul socket, anche se il kernel analizza
670 comunque il pacchetto, riempiendo gli opportuni campi della struttura
671 \struct{sockaddr\_ll} ad esso associata.
672
673 Si usano invece socket di tipo \const{SOCK\_DGRAM} quando si vuole operare a
674 livello di rete. In questo caso in fase di ricezione l'intestazione del
675 protocollo di collegamento viene rimossa prima di passare il resto del
676 pacchetto all'utente, mentre in fase di trasmissione viene creata una
677 opportuna intestazione per il protocollo a livello di collegamento
678 utilizzato, usando le informazioni necessarie che devono essere specificate
679 sempre con una struttura \struct{sockaddr\_ll}.
680
681 Nella creazione di un \textit{packet socket} il valore dell'argomento
682 \param{protocol} di \func{socket} serve a specificare, in \textit{network
683   order}, il numero identificativo del protocollo di collegamento si vuole
684 utilizzare. I valori possibili sono definiti secondo lo standard IEEE 802.3, e
685 quelli disponibili in Linux sono accessibili attraverso opportune costanti
686 simboliche definite nel file \file{linux/if\_ether.h}. Se si usa il valore
687 speciale \const{ETH\_P\_ALL} passeranno sul \textit{packet socket} tutti i
688 pacchetti, qualunque sia il loro protocollo di collegamento. Ovviamente l'uso
689 di questi socket è una operazione privilegiata e può essere effettuati solo da
690 un processo con i privilegi di amministratore (\ids{UID} effettivo nullo) o
691 con la \textit{capability} \const{CAP\_NET\_RAW}.
692
693 Una volta aperto un \textit{packet socket}, tutti i pacchetti del protocollo
694 specificato passeranno attraverso di esso, qualunque sia l'interfaccia da cui
695 provengono; se si vuole limitare il passaggio ad una interfaccia specifica
696 occorre usare la funzione \func{bind} per agganciare il socket a quest'ultima.
697
698 \begin{figure}[!htb]
699   \footnotesize \centering
700   \begin{minipage}[c]{\textwidth}
701     \includestruct{listati/sockaddr_ll.h}
702   \end{minipage} 
703   \caption{La struttura \structd{sockaddr\_ll} degli indirizzi dei
704     \textit{packet socket}.}
705   \label{fig:sock_sa_packet_struct}
706 \end{figure}
707
708 Nel caso dei \textit{packet socket} la struttura degli indirizzi è di tipo
709 \struct{sockaddr\_ll}, e la sua definizione è riportata in
710 fig.~\ref{fig:sock_sa_packet_struct}; essa però viene ad assumere un ruolo
711 leggermente diverso rispetto a quanto visto finora per gli altri tipi di
712 socket.  Infatti se il socket è di tipo \const{SOCK\_RAW} si deve comunque
713 scrivere tutto direttamente nel pacchetto, quindi la struttura non serve più a
714 specificare gli indirizzi. Essa mantiene questo ruolo solo per i socket di
715 tipo \const{SOCK\_DGRAM}, per i quali permette di specificare i dati necessari
716 al protocollo di collegamento, mentre viene sempre utilizzata in lettura (per
717 entrambi i tipi di socket), per la ricezione dei i dati relativi a ciascun
718 pacchetto.
719
720 Al solito il campo \var{sll\_family} deve essere sempre impostato al valore
721 \const{AF\_PACKET}. Il campo \var{sll\_protocol} indica il protocollo scelto,
722 e deve essere indicato in \textit{network order}, facendo uso delle costanti
723 simboliche definite in \file{linux/if\_ether.h}. Il campo \var{sll\_ifindex} è
724 l'indice dell'interfaccia, che, in caso di presenza di più interfacce dello
725 stesso tipo (se ad esempio si hanno più schede ethernet), permette di
726 selezionare quella con cui si vuole operare (un valore nullo indica qualunque
727 interfaccia).  Questi sono i due soli campi che devono essere specificati
728 quando si vuole selezionare una interfaccia specifica, usando questa struttura
729 con la funzione \func{bind}.
730
731 I campi \var{sll\_halen} e \var{sll\_addr} indicano rispettivamente
732 l'indirizzo associato all'interfaccia sul protocollo di collegamento e la
733 relativa lunghezza; ovviamente questi valori cambiano a seconda del tipo di
734 collegamento che si usa, ad esempio, nel caso di ethernet, questi saranno il
735 MAC address della scheda e la relativa lunghezza. Essi vengono usati, insieme
736 ai campi \var{sll\_family} e \var{sll\_ifindex} quando si inviano dei
737 pacchetti, in questo caso tutti gli altri campi devono essere nulli.
738
739 Il campo \var{sll\_hatype} indica il tipo ARP, come definito in
740 \file{linux/if\_arp.h}, mentre il campo \var{sll\_pkttype} indica il tipo di
741 pacchetto; entrambi vengono impostati alla ricezione di un pacchetto ed han
742 senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i
743 seguenti valori: \const{PACKET\_HOST} per un pacchetto indirizzato alla
744 macchina ricevente, \const{PACKET\_BROADCAST} per un pacchetto di
745 \textit{broadcast}, \const{PACKET\_MULTICAST} per un pacchetto inviato ad un
746 indirizzo fisico di \textit{multicast}, \const{PACKET\_OTHERHOST} per un
747 pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in
748 \index{modo~promiscuo} modo promiscuo), \const{PACKET\_OUTGOING} per un
749 pacchetto originato dalla propria macchina che torna indietro sul socket.
750
751
752 Si tenga presente infine che in fase di ricezione, anche se si richiede il
753 troncamento del pacchetto, le funzioni \func{recv}, \func{recvfrom} e
754 \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) restituiranno comunque la
755 lunghezza effettiva del pacchetto così come arrivato sulla linea.
756
757 %% \subsection{La struttura degli indirizzi DECnet}
758 %% \label{sec:sock_sa_decnet}
759  
760 %% I socket di tipo \const{PF\_DECnet} usano il protocollo DECnet, usato dai VAX
761 %% Digital sotto VMS quando ancora il TCP/IP non era diventato lo standard di
762 %% fatto. Il protocollo è un protocollo chiuso, ed il suo uso attuale è limitato
763 %% alla comunicazione con macchine che stanno comunque scomparendo. Lo si riporta
764 %% solo come esempio 
765
766
767 % TODO: trattare i socket RDS, vedi documentazione del kernel, file 
768 % Documentation/networking/rds.txt
769
770
771
772 \section{Le funzioni di conversione degli indirizzi}
773 \label{sec:sock_addr_func}
774
775 In questa sezione tratteremo delle varie funzioni usate per manipolare gli
776 indirizzi, limitandoci però agli indirizzi internet.  Come accennato gli
777 indirizzi e i numeri di porta usati nella rete devono essere forniti nel
778 cosiddetto \textit{network order}, che corrisponde al formato \textit{big
779   endian}, anche quando la proprio macchina non usa questo formati, cosa che
780 può comportare la necessità di eseguire delle conversioni.
781
782
783 \subsection{Le funzioni per il riordinamento}
784 \label{sec:sock_func_ord}
785
786 Come già visto in sez.~\ref{sec:endianness} il problema connesso
787 all'\textit{endianness} è che quando si passano dei dati da un tipo di
788 architettura all'altra i dati vengono interpretati in maniera diversa, e ad
789 esempio nel caso dell'intero a 16 bit ci si ritroverà con i due byte in cui è
790 suddiviso scambiati di posto.  Per questo motivo si usano delle funzioni di
791 conversione che servono a tener conto automaticamente della possibile
792 differenza fra l'ordinamento usato sul computer e quello che viene usato nelle
793 trasmissione sulla rete; queste funzioni sono \funcd{htonl}, \funcd{htons},
794 \funcd{ntohl} e \funcd{ntohs} ed i rispettivi prototipi sono:
795 \begin{functions}
796   \headdecl{netinet/in.h}
797   \funcdecl{unsigned long int htonl(unsigned long int hostlong)} 
798   Converte l'intero a 32 bit \param{hostlong} dal formato della macchina a
799   quello della rete.
800  
801   \funcdecl{unsigned short int htons(unsigned short int hostshort)}
802   Converte l'intero a 16 bit \param{hostshort} dal formato della macchina a
803   quello della rete.
804
805   \funcdecl{unsigned long int ntohl(unsigned long int netlong)}
806   Converte l'intero a 32 bit \param{netlong} dal formato della rete a quello
807   della macchina.
808
809   \funcdecl{unsigned sort int ntohs(unsigned short int netshort)}
810   Converte l'intero a 16 bit \param{netshort} dal formato della rete a quello
811   della macchina.
812   
813   \bodydesc{Tutte le funzioni restituiscono il valore convertito, e non
814     prevedono errori.}
815 \end{functions}
816
817 I nomi sono assegnati usando la lettera \texttt{n} come mnemonico per indicare
818 l'ordinamento usato sulla rete (da \textit{network order}) e la lettera
819 \texttt{h} come mnemonico per l'ordinamento usato sulla macchina locale (da
820 \textit{host order}), mentre le lettere \texttt{s} e \texttt{l} stanno ad
821 indicare i tipi di dato (\ctyp{long} o \ctyp{short}, riportati anche dai
822 prototipi).
823
824 Usando queste funzioni si ha la conversione automatica: nel caso in cui la
825 macchina che si sta usando abbia una architettura \textit{big endian} queste
826 funzioni sono definite come macro che non fanno nulla. Per questo motivo vanno
827 sempre utilizzate, anche quando potrebbero non essere necessarie, in modo da
828 assicurare la portabilità del codice su tutte le architetture.
829
830
831 \subsection{Le funzioni \func{inet\_aton}, \func{inet\_addr} e 
832   \func{inet\_ntoa}}
833 \label{sec:sock_func_ipv4}
834
835 Un secondo insieme di funzioni di manipolazione serve per passare dal formato
836 binario usato nelle strutture degli indirizzi alla rappresentazione simbolica
837 dei numeri IP che si usa normalmente.
838
839 Le prime tre funzioni di manipolazione riguardano la conversione degli
840 indirizzi IPv4 da una stringa in cui il numero di IP è espresso secondo la
841 cosiddetta notazione \textit{dotted-decimal}, (cioè nella forma
842 \texttt{192.168.0.1}) al formato binario (direttamente in \textit{network
843   order}) e viceversa; in questo caso si usa la lettera \texttt{a} come
844 mnemonico per indicare la stringa. Dette funzioni sono \funcd{inet\_addr},
845 \funcd{inet\_aton} e \funcd{inet\_ntoa}, ed i rispettivi prototipi sono:
846 \begin{functions}
847   \headdecl{arpa/inet.h}
848   
849   \funcdecl{in\_addr\_t inet\_addr(const char *strptr)} Converte la stringa
850   dell'indirizzo \textit{dotted decimal} in nel numero IP in network order.
851
852   \funcdecl{int inet\_aton(const char *src, struct in\_addr *dest)} Converte
853   la stringa dell'indirizzo \textit{dotted decimal} in un indirizzo IP.
854
855   \funcdecl{char *inet\_ntoa(struct in\_addr addrptr)}
856   Converte un indirizzo IP in una stringa \textit{dotted decimal}.
857
858   \bodydesc{Tutte queste le funzioni non generano codice di errore.}
859 \end{functions}
860
861 La prima funzione, \func{inet\_addr}, restituisce l'indirizzo a 32 bit in
862 network order (del tipo \type{in\_addr\_t}) a partire dalla stringa passata
863 nell'argomento \param{strptr}. In caso di errore (quando la stringa non esprime
864 un indirizzo valido) restituisce invece il valore \const{INADDR\_NONE} che
865 tipicamente sono trentadue bit a uno.  Questo però comporta che la stringa
866 \texttt{255.255.255.255}, che pure è un indirizzo valido, non può essere usata
867 con questa funzione; per questo motivo essa è generalmente deprecata in favore
868 di \func{inet\_aton}.
869
870 La funzione \func{inet\_aton} converte la stringa puntata da \param{src}
871 nell'indirizzo binario che viene memorizzato nell'opportuna struttura
872 \struct{in\_addr} (si veda fig.~\ref{fig:sock_sa_ipv4_struct}) situata
873 all'indirizzo dato dall'argomento \param{dest} (è espressa in questa forma in
874 modo da poterla usare direttamente con il puntatore usato per passare la
875 struttura degli indirizzi). La funzione restituisce un valore diverso da zero
876 se l'indirizzo è valido e la conversione ha successo e 0 in caso contrario.
877 Se usata con \param{dest} inizializzato a \val{NULL} effettua la validazione
878 dell'indirizzo.
879
880 L'ultima funzione, \func{inet\_ntoa}, converte il valore a 32 bit
881 dell'indirizzo (espresso in \textit{network order}) restituendo il puntatore
882 alla stringa che contiene l'espressione in formato dotted decimal. Si deve
883 tenere presente che la stringa risiede in memoria statica, per cui questa
884 funzione non è rientrante.
885
886
887 \subsection{Le funzioni \func{inet\_pton} e \func{inet\_ntop}}
888 \label{sec:sock_conv_func_gen}
889
890 Le tre funzioni precedenti sono limitate solo ad indirizzi IPv4, per questo
891 motivo è preferibile usare le due nuove funzioni \func{inet\_pton} e
892 \func{inet\_ntop} che possono convertire anche gli indirizzi IPv6. Anche in
893 questo caso le lettere \texttt{n} e \texttt{p} sono degli mnemonici per
894 ricordare il tipo di conversione effettuata e stanno per \textit{presentation}
895 e \textit{numeric}.
896
897 Entrambe le funzioni accettano l'argomento \param{af} che indica il tipo di
898 indirizzo, e che può essere soltanto \const{AF\_INET} o \const{AF\_INET6}. La
899 prima funzione, \funcd{inet\_pton}, serve a convertire una stringa in un
900 indirizzo; il suo prototipo è:
901 \begin{prototype}{sys/socket.h}
902 {int inet\_pton(int af, const char *src, void *addr\_ptr)} 
903
904   Converte l'indirizzo espresso tramite una stringa nel valore numerico.
905   
906   \bodydesc{La funzione restituisce un valore negativo se \param{af} specifica
907     una famiglia di indirizzi non valida, con \var{errno} che assume il valore
908     \errcode{EAFNOSUPPORT}, un valore nullo se \param{src} non rappresenta un
909     indirizzo valido, ed un valore positivo in caso di successo.}
910 \end{prototype}
911
912 La funzione converte la stringa indicata tramite \param{src} nel valore
913 numerico dell'indirizzo IP del tipo specificato da \param{af} che viene
914 memorizzato all'indirizzo puntato da \param{addr\_ptr}, la funzione
915 restituisce un valore positivo in caso di successo, nullo se la stringa non
916 rappresenta un indirizzo valido, e negativo se \param{af} specifica una
917 famiglia di indirizzi non valida.
918
919 La seconda funzione di conversione è \funcd{inet\_ntop} che converte un
920 indirizzo in una stringa; il suo prototipo è:
921 \begin{prototype}{sys/socket.h}
922   {char *inet\_ntop(int af, const void *addr\_ptr, char *dest, size\_t len)}
923   Converte l'indirizzo dalla relativa struttura in una stringa simbolica.
924  
925   \bodydesc{La funzione restituisce un puntatore non nullo alla stringa
926     convertita in caso di successo e \val{NULL} in caso di fallimento, nel
927     qual caso \var{errno} assume i valori: 
928     \begin{errlist}
929     \item[\errcode{ENOSPC}] le dimensioni della stringa con la conversione
930       dell'indirizzo eccedono la lunghezza specificata da \param{len}.
931     \item[\errcode{ENOAFSUPPORT}] la famiglia di indirizzi \param{af} non è
932       una valida.
933   \end{errlist}}
934 \end{prototype}
935
936 La funzione converte la struttura dell'indirizzo puntata da \param{addr\_ptr}
937 in una stringa che viene copiata nel buffer puntato dall'indirizzo
938 \param{dest}; questo deve essere preallocato dall'utente e la lunghezza deve
939 essere almeno \const{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e
940 \const{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
941 comunque venire specificata attraverso il parametro \param{len}.
942
943 Gli indirizzi vengono convertiti da/alle rispettive strutture di indirizzo
944 (una struttura \struct{in\_addr} per IPv4, e una struttura \struct{in6\_addr}
945 per IPv6), che devono essere precedentemente allocate e passate attraverso il
946 puntatore \param{addr\_ptr}; l'argomento \param{dest} di \func{inet\_ntop} non
947 può essere nullo e deve essere allocato precedentemente.
948
949 Il formato usato per gli indirizzi in formato di presentazione è la notazione
950 \textit{dotted decimal} per IPv4 e quello descritto in
951 sez.~\ref{sec:IP_ipv6_notation} per IPv6.
952
953
954
955
956
957
958
959 % LocalWords:  socket sez cap BSD SVr XTI Transport Interface TCP stream UDP PF
960 % LocalWords:  datagram broadcast descriptor sys int domain type protocol errno
961 % LocalWords:  EPROTONOSUPPORT ENFILE kernel EMFILE EACCES EINVAL ENOBUFS raw
962 % LocalWords:  ENOMEM table family AF address name glibc UNSPEC LOCAL Local IPv
963 % LocalWords:  communication INET protocols ip AX Amateur IPX Novell APPLETALK
964 % LocalWords:  Appletalk ddp NETROM NetROM Multiprotocol ATMPVC Access to ATM
965 % LocalWords:  PVCs ITU ipv PLP DECnet Reserved for project NETBEUI LLC KEY key
966 % LocalWords:  SECURITY Security callback NETLINK interface device netlink Low
967 % LocalWords:  PACKET level packet ASH Ash ECONET Acorn Econet ATMSVC SVCs SNA
968 % LocalWords:  IRDA PPPOX PPPoX WANPIPE Wanpipe BLUETOOTH Bluetooth POSIX bits
969 % LocalWords:  dall'header tab SOCK capabilities capability styles DGRAM read
970 % LocalWords:  SEQPACKET RDM sockaddr reference void fig Header uint socklen at
971 % LocalWords:  addr netinet port len Stevens unsigned short casting nell'header
972 % LocalWords:  BIND SERVICE bind union order big endian flowinfo dell'header ll
973 % LocalWords:  multicast multicasting local socketpair sun path filesystem AARP
974 % LocalWords:  pathname AppleTalk netatalk personal Apple ATPROTO atalk sat if
975 % LocalWords:  ANYNET node ANYNODE ATADDR BCAST pcap IEEE linux ether ETH ALL
976 % LocalWords:  sll ifindex ethernet halen MAC hatype ARP arp pkttype HOST recv
977 % LocalWords:  OTHERHOST OUTGOING recvfrom recvmsg endianness little endtest Mac
978 % LocalWords:  Intel Digital Motorola IBM VME PowerPC l'Intel xABCD ptr htonl
979 % LocalWords:  htons ntohl ntohs long hostlong hostshort netlong
980 % LocalWords:  sort netshort host inet aton ntoa dotted decimal const char src
981 % LocalWords:  strptr struct dest addrptr INADDR NULL pton ntop presentation af
982 % LocalWords:  numeric EAFNOSUPPORT size ENOSPC ENOAFSUPPORT ADDRSTRLEN ROUTE
983 % LocalWords:  of tcpdump page
984
985
986 %%% Local Variables: 
987 %%% mode: latex
988 %%% TeX-master: "gapil"
989 %%% End: