Piccole correzioni dimenticate
[gapil.git] / socket.tex
1 %% socket.tex
2 %%
3 %% Copyright (C) 2000-2017 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 i \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        \constd{AF\_UNSPEC}   & 0& Non specificato               &            \\
203        \constd{AF\_LOCAL}    & 1& Local communication           & unix(7)    \\
204        \constd{AF\_UNIX}, \constd{AF\_FILE}&1&Sinonimi di \const{AF\_LOCAL}& \\
205        \constd{AF\_INET}     & 2& IPv4 Internet protocols       & ip(7)      \\
206        \constd{AF\_AX25}     & 3& Amateur radio AX.25 protocol  &            \\
207        \constd{AF\_IPX}      & 4& IPX - Novell protocols        &            \\
208        \constd{AF\_APPLETALK}& 5& Appletalk                     & ddp(7)     \\
209        \constd{AF\_NETROM}   & 6& Amateur radio NetROM          &            \\
210        \constd{AF\_BRIDGE}   & 7& Multiprotocol bridge          &            \\
211        \constd{AF\_ATMPVC}   & 8& Access to raw ATM PVCs        &            \\
212        \constd{AF\_X25}      & 9& ITU-T X.25 / ISO-8208 protocol& x25(7)     \\
213        \constd{AF\_INET6}    &10& IPv6 Internet protocols       & ipv6(7)    \\
214        \constd{AF\_ROSE}     &11& Amateur Radio X.25 PLP        &            \\
215        \constd{AF\_DECnet}   &12& Reserved for DECnet project   &            \\
216        \constd{AF\_NETBEUI}  &13& Reserved for 802.2LLC project &            \\
217        \constd{AF\_SECURITY} &14& Security callback pseudo AF   &            \\
218        \constd{AF\_KEY}      &15& AF\_KEY key management API    &            \\
219        \constd{AF\_NETLINK}  &16& Kernel user interface device  & netlink(7) \\
220        \constd{AF\_ROUTE}    &16& Sinonimo di \const{AF\_NETLINK} emula BSD.&\\
221        \constd{AF\_PACKET}   &17& Low level packet interface    & packet(7)  \\
222        \constd{AF\_ASH}      &18& Ash                           &    \\
223        \constd{AF\_ECONET}   &19& Acorn Econet                  &    \\
224        \constd{AF\_ATMSVC}   &20& ATM SVCs                      &    \\
225        \constd{AF\_SNA}      &22& Linux SNA Project             &    \\
226        \constd{AF\_IRDA}     &23& IRDA socket (infrarossi)      &    \\
227        \constd{AF\_PPPOX}    &24& PPPoX socket                  &    \\
228        \constd{AF\_WANPIPE}  &25& Wanpipe API socket            &    \\
229        \constd{AF\_LLC}      &26& Linux LLC                     &    \\
230        \constd{AF\_CAN}      &29& Controller Are Network        &    \\
231        \constd{AF\_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 L'idea alla base della distinzione fra questi due insiemi di costanti era che
239 una famiglia di protocolli potesse supportare vari tipi di indirizzi, per cui
240 il prefisso \texttt{PF\_} si sarebbe dovuto usare nella creazione dei socket e
241 il prefisso \texttt{AF\_} in quello delle strutture degli indirizzi. Questo è
242 quanto specificato anche dallo standard POSIX.1g, ma non esistono a tuttora
243 famiglie di protocolli che supportino diverse strutture di indirizzi, per cui
244 nella pratica questi due nomi sono equivalenti e corrispondono agli stessi
245 valori numerici.\footnote{in Linux, come si può verificare andando a guardare
246   il contenuto di \file{bits/socket.h}, le costanti sono esattamente le stesse
247   e ciascuna \texttt{AF\_} è definita alla corrispondente \texttt{PF\_} e con
248   lo stesso nome.} Qui si sono indicati i nomi con il prefisso \texttt{AF\_}
249 seguendo la convenzione usata nelle pagine di manuale.
250
251 I domini (e i relativi nomi simbolici), così come i nomi delle famiglie di
252 indirizzi, sono definiti dall'\textit{header file} \headfiled{socket.h}. Un
253 elenco delle famiglie di protocolli disponibili in Linux è riportato in
254 tab.~\ref{tab:net_pf_names}. L'elenco indica tutti i protocolli definiti; fra
255 questi però saranno utilizzabili solo quelli per i quali si è compilato il
256 supporto nel kernel (o si sono caricati gli opportuni moduli), viene definita
257 anche una costante \constd{AF\_MAX} che indica il valore massimo associabile
258 ad un dominio.
259
260 Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili
261 dall'utente generico, ad esempio in generale tutti i socket di tipo
262 \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi
263 di amministratore (cioè con \ids{UID} effettivo uguale a zero) o dotati della
264 \textit{capability} \const{CAP\_NET\_RAW}.
265
266
267 \subsection{Il tipo di socket}
268 \label{sec:sock_type}
269
270 La scelta di un dominio non comporta però la scelta dello stile di
271 comunicazione, questo infatti viene a dipendere dal protocollo che si andrà ad
272 utilizzare fra quelli disponibili nella famiglia scelta. L'interfaccia dei
273 socket permette di scegliere lo stile di comunicazione indicando il tipo di
274 socket con l'argomento \param{type} di \func{socket}. Linux mette a
275 disposizione vari tipi di socket (che corrispondono a quelli che il manuale
276 della \acr{glibc} \cite{GlibcMan} chiama \textit{styles}) identificati dalle
277 seguenti costanti:\footnote{le pagine di manuale POSIX riportano solo i primi
278   tre tipi, Linux supporta anche gli altri, come si può verificare nel file
279   \texttt{include/linux/net.h} dei sorgenti del kernel.}
280
281 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
282 \item[\constd{SOCK\_STREAM}] Provvede un canale di trasmissione dati
283   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
284   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
285   byte (da cui il nome \textit{stream}) e possono essere letti in blocchi di
286   dimensioni qualunque. Può supportare la trasmissione dei cosiddetti dati
287   urgenti (o \textit{out-of-band}, vedi sez.~\ref{sec:TCP_urgent_data}).
288 \item[\constd{SOCK\_DGRAM}] Viene usato per trasmettere pacchetti di dati
289   (\textit{datagram}) di lunghezza massima prefissata, indirizzati
290   singolarmente. Non esiste una connessione e la trasmissione è effettuata in
291   maniera non affidabile.
292 \item[\constd{SOCK\_SEQPACKET}] Provvede un canale di trasmissione di dati
293   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
294   altro socket. I dati possono vengono trasmessi per pacchetti di dimensione
295   massima fissata, e devono essere letti integralmente da ciascuna chiamata a
296   \func{read}.
297 \item[\constd{SOCK\_RAW}] Provvede l'accesso a basso livello ai protocolli di
298   rete e alle varie interfacce. I normali programmi di comunicazione non
299   devono usarlo, è riservato all'uso di sistema.
300 \item[\constd{SOCK\_RDM}] Provvede un canale di trasmissione di dati
301   affidabile, ma in cui non è garantito l'ordine di arrivo dei pacchetti.
302 \item[\constd{SOCK\_PACKET}] Obsoleto, non deve essere più usato (e pertanto
303   non ne parleremo ulteriormente).
304 \end{basedescript}
305
306 A partire dal kernel 2.6.27 l'argomento \param{type} della funzione
307 \func{socket} assume un significato ulteriore perché può essere utlizzato per
308 impostare dei flag relativi alle caratteristiche generali del \textit{socket}
309 non strettamente attinenti all'indicazione del tipo secondo i valori appena
310 illustrati. Essi infatti possono essere combinati con un OR aritmetico delle
311 ulteriori costanti:
312 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
313 \item[\constd{SOCK\_CLOEXEC}] imposta il flag di \textit{close-on-exec} sul
314   file descriptor del socket, ottenendo lo stesso effetto del flag
315   \const{O\_CLOEXEC} di \func{open} (vedi tab.~\ref{tab:open_operation_flag}),
316   di cui costituisce l'analogo.
317
318 \item[\constd{SOCK\_NONBLOCK}] crea il socket in modalità non-bloccante, con
319   effetti identici ad una successiva chiamata a \func{fcntl} per impostare il
320   flag di \const{O\_NONBLOCK} sul file descriptor (si faccia di nuovo
321   riferimenti al significato di quest'ultimo come spiegato in
322   tab.~\ref{tab:open_operation_flag}).
323 \end{basedescript}
324
325
326 Si tenga presente inoltre che non tutte le combinazioni fra una famiglia di
327 protocolli e un tipo di socket sono valide, in quanto non è detto che in una
328 famiglia esista un protocollo per ciascuno dei diversi stili di comunicazione
329 appena elencati.
330
331 \begin{table}[htb]
332   \footnotesize
333   \centering
334   \begin{tabular}{|l|c|c|c|c|c|}
335     \hline
336     \multicolumn{1}{|c|}{\textbf{Famiglia}}&
337     \multicolumn{5}{|c|}{\textbf{Tipo}}\\
338     \hline
339     \hline
340     &\const{SOCK\_STREAM} &\const{SOCK\_DGRAM}     &\const{SOCK\_RAW}& 
341       \const{SOCK\_RDM}&\const{SOCK\_SEQPACKET} \\
342      \hline
343     \const{AF\_UNIX}     &  si & si  &  --  & -- &  si\footnotemark \\
344      \hline
345     \const{AF\_LOCAL}&\multicolumn{5}{|c|}{sinonimo di \const{AF\_UNIX}}\\
346      \hline
347     \const{AF\_INET}      & TCP & UDP & IPv4 & --  & --  \\
348      \hline
349     \const{AF\_INET6}     & TCP & UDP & IPv6 & --  & -- \\
350      \hline
351     \const{AF\_IPX}       & --  & --  &  --  & --  & -- \\
352      \hline
353     \const{AF\_NETLINK}   & --  & si  &  si  & --  & -- \\
354      \hline
355     \const{AF\_X25}       & --  & --  &  --  & --  & si \\
356      \hline
357     \const{AF\_AX25}      & --  & --  &  --  & --  & -- \\
358      \hline
359     \const{AF\_ATMPVC}    & --  & --  &  --  & --  & -- \\
360      \hline
361     \const{AF\_APPLETALK} & --  & si  &  si  & --  & -- \\
362      \hline
363     \const{AF\_PACKET}    & --  & si  &  si  & --  & -- \\
364      \hline
365   \end{tabular}
366   \caption{Combinazioni valide di dominio e tipo di protocollo per la 
367     funzione \func{socket}.}
368   \label{tab:sock_sock_valid_combinations}
369 \end{table}
370
371 \footnotetext{supportati a partire dal kernel 2.6.4 per socket che conservano
372   i limiti dei messaggi e li consegnano in sequenza ordinata.}
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 il protocollo non abbia un nome definito, mentre si sono
378 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     \typed{int8\_t}   & intero a 8 bit con segno   & \headfile{sys/types.h}\\
443     \typed{uint8\_t}  & intero a 8 bit senza segno & \headfile{sys/types.h}\\
444     \typed{int16\_t}  & intero a 16 bit con segno  & \headfile{sys/types.h}\\
445     \typed{uint16\_t} & intero a 16 bit senza segno& \headfile{sys/types.h}\\
446     \typed{int32\_t}  & intero a 32 bit con segno  & \headfile{sys/types.h}\\
447     \typed{uint32\_t} & intero a 32 bit senza segno& \headfile{sys/types.h}\\
448     \hline
449     \typed{sa\_family\_t} & famiglia degli indirizzi&\headfile{sys/socket.h}\\
450     \typed{socklen\_t} & lunghezza (\type{uint32\_t}) dell'indirizzo di
451     un socket& \headfile{sys/socket.h}\\
452     \hline
453     \typed{in\_addr\_t} & indirizzo IPv4 (\type{uint32\_t}) & 
454     \headfile{netinet/in.h}\\
455     \typed{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 \begin{figure}[!htb]
471   \footnotesize \centering
472   \begin{minipage}[c]{0.80\textwidth}
473     \includestruct{listati/sockaddr.h}
474   \end{minipage} 
475   \caption{La struttura generica degli indirizzi dei socket
476     \structd{sockaddr}.} 
477   \label{fig:sock_sa_gen_struct}
478 \end{figure}
479
480 Dal punto di vista del programmatore l'unico uso di questa struttura è quello
481 di fare da riferimento per il casting, per il kernel le cose sono un po'
482 diverse, in quanto esso usa il puntatore per recuperare il campo
483 \var{sa\_family}, comune a tutte le famiglie, con cui determinare il tipo di
484 indirizzo; per questo motivo, anche se l'uso di un puntatore \ctyp{void *}
485 sarebbe più immediato per l'utente (che non dovrebbe più eseguire il casting),
486 è stato mantenuto l'uso di questa struttura.
487
488 Se si usa una struttura \struct{sockaddr} per allocare delle variabili
489 generiche da usare in seguito per degli indirizzi si pone il problema che
490 niente assicura che i dati necessari per le varie famiglie di indirizzi
491 possano rientrare nella dimensione del campo \var{sa\_data} indicata in
492 fig.~\ref{fig:sock_sa_gen_struct}, anzi, come vedremo in
493 sez.~\ref{sec:sock_sa_ipv6}, nel caso di indirizzi IPv6 questa non è proprio
494 sufficiente. 
495
496 \begin{figure}[!htb]
497   \footnotesize \centering
498   \begin{minipage}[c]{0.90\textwidth}
499     \includestruct{listati/sockaddr_storage.h}
500   \end{minipage} 
501   \caption{La struttura generica degli indirizzi dei socket
502     \structd{sockaddr\_storage}.} 
503   \label{fig:sock_sa_storage_struct}
504 \end{figure}
505
506 Per questo l'interfaccia di programmazione dei socket prevede la defizione di
507 una speciale struttura \struct{sockaddr\_storage} illustrata in
508 fig.~\ref{fig:sock_sa_storage_struct}, in cui di nuovo si usa il primo campo
509 (\var{ss\_family}) per indicare il tipo di indirizzo, ed in cui i campi
510 successivi sono utilizzati per allineare i dati al tipo di architettura
511 hardware utilizzata, e per allocare uno spazio sufficiente ampio per contenere
512 qualunque tipo di indirizzo supportato. Allocando questa struttura si ha la
513 certezza di non eccedere le dimensioni qualunque sia il tipo di indirizzi che
514 si useranno, pertanto risulta utile tutte le volte che si devono gestire in
515 maniera generica tipi di indirizzi diversi (ad esempio IPv4 ed IPv6).
516
517
518 \subsection{La struttura degli indirizzi IPv4}
519 \label{sec:sock_sa_ipv4}
520
521 I socket di tipo \const{AF\_INET} vengono usati per la comunicazione
522 attraverso Internet; la struttura per gli indirizzi per un socket Internet (se
523 si usa IPv4) è definita come \struct{sockaddr\_in} nell'header file
524 \headfiled{netinet/in.h} ed ha la forma mostrata in
525 fig.~\ref{fig:sock_sa_ipv4_struct}, conforme allo standard POSIX.1g.
526
527 \begin{figure}[!htb]
528   \footnotesize\centering
529   \begin{minipage}[c]{0.80\textwidth}
530     \includestruct{listati/sockaddr_in.h}
531   \end{minipage} 
532   \caption{La struttura \structd{sockaddr\_in} degli indirizzi dei socket
533     Internet (IPv4) e la struttura \structd{in\_addr} degli indirizzi IPv4.}
534   \label{fig:sock_sa_ipv4_struct}
535 \end{figure}
536
537 L'indirizzo di un socket Internet (secondo IPv4) comprende l'indirizzo
538 Internet di un'interfaccia più un \textsl{numero di porta} (affronteremo in
539 dettaglio il significato di questi numeri in sez.~\ref{sec:TCP_port_num}).  Il
540 protocollo IP di per sé non prevede numeri di porta, questi sono utilizzati
541 solo dai protocolli di livello superiore come TCP e UDP, ma devono essere
542 indicati qui. Inoltre questa struttura viene usata anche per i socket RAW che
543 accedono direttamente al livello di IP, in questo caso il numero della porta
544 deve essere impostato al numero di protocollo.
545
546 Il membro \var{sin\_family} deve essere sempre impostato a \constd{AF\_INET},
547 altrimenti si avrà un errore di \errcode{EINVAL}; il membro \var{sin\_port}
548 specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono
549 chiamati \textsl{riservati} in quanto utilizzati da servizi standard e
550 soltanto processi con i privilegi di amministratore (con \ids{UID} effettivo
551 uguale a zero) o con la \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}
552 possono usare la funzione \func{bind} (che vedremo in
553 sez.~\ref{sec:TCP_func_bind}) su queste porte.
554
555 Il membro \var{sin\_addr} contiene un indirizzo Internet, e viene acceduto sia
556 come struttura (un resto di una implementazione precedente in cui questa era
557 una \dirct{union} usata per accedere alle diverse classi di indirizzi) che
558 direttamente come intero. In \headfile{netinet/in.h} vengono definite anche
559 alcune costanti che identificano alcuni indirizzi speciali, riportati in
560 tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
561
562 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
563 essere specificati in quello che viene chiamato \textit{network order}, cioè
564 con i bit ordinati in formato \textit{big endian} (vedi
565 sez.~\ref{sec:endianness}), questo comporta la necessità di usare apposite
566 funzioni di conversione per mantenere la portabilità del codice (vedi
567 sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
568 soluzioni).
569
570
571 \subsection{La struttura degli indirizzi IPv6}
572 \label{sec:sock_sa_ipv6}
573
574 Essendo IPv6 un'estensione di IPv4, i socket di tipo \const{AF\_INET6} sono
575 sostanzialmente identici ai precedenti; la parte in cui si trovano
576 praticamente tutte le differenze fra i due socket è quella della struttura
577 degli indirizzi; la sua definizione, presa da \headfile{netinet/in.h}, è
578 riportata in fig.~\ref{fig:sock_sa_ipv6_struct}.
579
580 \begin{figure}[!htb]
581   \footnotesize \centering
582   \begin{minipage}[c]{0.80\textwidth}
583     \includestruct{listati/sockaddr_in6.h}
584   \end{minipage} 
585   \caption{La struttura \structd{sockaddr\_in6} degli indirizzi dei socket
586     IPv6 e la struttura \structd{in6\_addr} degli indirizzi IPv6.}
587   \label{fig:sock_sa_ipv6_struct}
588 \end{figure}
589
590 Il campo \var{sin6\_family} deve essere sempre impostato ad \constd{AF\_INET6},
591 il campo \var{sin6\_port} è analogo a quello di IPv4 e segue le stesse regole;
592 il campo \var{sin6\_flowinfo} è a sua volta diviso in tre parti di cui i 24
593 bit inferiori indicano l'etichetta di flusso, i successivi 4 bit la priorità e
594 gli ultimi 4 sono riservati. Questi valori fanno riferimento ad alcuni campi
595 specifici dell'header dei pacchetti IPv6 (vedi sez.~\ref{sec:IP_ipv6head}) ed
596 il loro uso è sperimentale.
597
598 Il campo \var{sin6\_addr} contiene l'indirizzo a 128 bit usato da IPv6,
599 espresso da un vettore di 16 byte; anche in questo caso esistono alcuni valori
600 predediniti, ma essendo il campo un vettore di byte non è possibile assegnarli
601 con il calore di una costante. Esistono però le variabili predefinite
602 \var{in6addr\_any} (che indica l'indirizzo generico) e \var{in6addr\_loopback}
603 (che indica l'indirizzo di loopback) il cui valore può essere copiato in
604 questo campo. A queste due variabili si aggiungono le macro
605 \macrod{IN6ADDR\_ANY\_INIT} e \macrod{IN6ADDR\_LOOPBACK\_INIT} per effettuare
606 delle assegnazioni statiche.
607
608 Infine il campo \var{sin6\_scope\_id} è un campo introdotto in Linux con il
609 kernel 2.4, per gestire alcune operazioni riguardanti il
610 \textit{multicasting}, è supportato solo per gli indirizzi di tipo
611 \textit{link-local} (vedi sez.~\ref{sec:IP_ipv6_unicast}) e deve contenere
612 l'\textit{interface index} (vedi sez.~\ref{sec:sock_ioctl_netdevice}) della
613 scheda di rete.  Si noti infine che \struct{sockaddr\_in6} ha una dimensione
614 maggiore della struttura \struct{sockaddr} generica di
615 fig.~\ref{fig:sock_sa_gen_struct}, quindi occorre stare attenti a non avere
616 fatto assunzioni riguardo alla possibilità di contenere i dati nelle
617 dimensioni di quest'ultima (per questo se necessario è opportuno usare
618 \struct{sockaddr\_storage}).
619
620
621 \subsection{La struttura degli indirizzi locali}
622 \label{sec:sock_sa_local}
623
624 I socket di tipo \const{AF\_UNIX} o \const{AF\_LOCAL} vengono usati per una
625 comunicazione fra processi che stanno sulla stessa macchina (per questo
626 vengono chiamati \textit{local domain} o anche \textit{Unix domain}); essi
627 hanno la caratteristica ulteriore di poter essere creati anche in maniera
628 anonima attraverso la funzione \func{socketpair} (che abbiamo trattato in
629 sez.~\ref{sec:ipc_socketpair}).  Quando però si vuole fare riferimento
630 esplicito ad uno di questi socket si deve usare una struttura degli indirizzi
631 di tipo \struct{sockaddr\_un}, la cui definizione si è riportata in
632 fig.~\ref{fig:sock_sa_local_struct}.
633
634 \begin{figure}[!htb]
635   \footnotesize \centering
636   \begin{minipage}[c]{0.80\textwidth}
637     \includestruct{listati/sockaddr_un.h}
638   \end{minipage} 
639   \caption{La struttura \structd{sockaddr\_un} degli indirizzi dei socket
640     locali (detti anche \textit{unix domain}) definita in
641     \headfiled{sys/un.h}.}
642   \label{fig:sock_sa_local_struct}
643 \end{figure}
644
645 In questo caso il campo \var{sun\_family} deve essere \constd{AF\_UNIX},
646 mentre il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due
647 forme; può essere ``\textit{named}'' ed in tal caso deve corrispondere ad un
648 file (di tipo socket) presente nel filesystem o essere ``\textit{abstract}''
649 nel qual caso viene identificato da una stringa univoca in uno spazio di nomi
650 astratto. 
651
652 Nel primo caso l'indirizzo viene specificato in \var{sun\_path} come una
653 stringa (terminata da uno zero) corrispondente al \textit{pathname} del file;
654 nel secondo caso (che è specifico di Linux e non portabile) \var{sun\_path}
655 deve iniziare con uno zero ed il nome verrà costituito dai restanti byte che
656 verranno interpretati come stringa senza terminazione (un byte nullo non ha in
657 questo caso nessun significato).
658
659 In realtà esiste una terza forma, \textit{unnamed}, che non è possibile
660 indicare in fase di scrittura, ma che è quella che viene usata quando si legge
661 l'indirizzo di un socket anonimo creato con \texttt{socketpair}; in tal caso
662 la struttura restituita è di dimensione \code{sizeof(sa\_family\_t)}, quindi
663 \var{sun\_path} non esiste e non deve essere referenziato.
664
665 \subsection{La struttura degli indirizzi AppleTalk}
666 \label{sec:sock_sa_appletalk}
667
668 I socket di tipo \const{AF\_APPLETALK} sono usati dalla libreria
669 \file{netatalk} per implementare la comunicazione secondo il protocollo
670 AppleTalk, uno dei primi protocolli di rete usato nel mondo dei personal
671 computer, usato dalla Apple per connettere fra loro computer e stampanti. Il
672 kernel supporta solo due strati del protocollo, DDP e AARP, e di norma è
673 opportuno usare le funzioni della libreria \texttt{netatalk}, tratteremo qui
674 questo argomento principalmente per mostrare l'uso di un protocollo
675 alternativo.
676
677 I socket AppleTalk permettono di usare il protocollo DDP, che è un protocollo
678 a pacchetto, di tipo \const{SOCK\_DGRAM}; l'argomento \param{protocol} di
679 \func{socket} deve essere nullo. È altresì possibile usare i socket raw
680 specificando un tipo \const{SOCK\_RAW}, nel qual caso l'unico valore valido
681 per \param{protocol} è \constd{ATPROTO\_DDP}.
682
683 Gli indirizzi AppleTalk devono essere specificati tramite una struttura
684 \struct{sockaddr\_atalk}, la cui definizione è riportata in
685 fig.~\ref{fig:sock_sa_atalk_struct}; la struttura viene dichiarata includendo
686 il file \headfiled{netatalk/at.h}.
687
688 \begin{figure}[!htb]
689   \footnotesize \centering
690   \begin{minipage}[c]{0.80\textwidth}
691     \includestruct{listati/sockaddr_atalk.h}
692   \end{minipage} 
693   \caption{La struttura \structd{sockaddr\_atalk} degli indirizzi dei socket
694     AppleTalk, e la struttura \structd{at\_addr} degli indirizzi AppleTalk.}
695   \label{fig:sock_sa_atalk_struct}
696 \end{figure}
697
698 Il campo \var{sat\_family} deve essere sempre \constd{AF\_APPLETALK}, mentre
699 il campo \var{sat\_port} specifica la porta che identifica i vari
700 servizi. Valori inferiori a 129 sono usati per le \textsl{porte riservate}, e
701 possono essere usati solo da processi con i privilegi di amministratore o con
702 la \textit{capability} \const{CAP\_NET\_BIND\_SERVICE}.  
703
704 L'indirizzo remoto è specificato nella struttura \var{sat\_addr}, e deve
705 essere in \textit{network order} (vedi sez.~\ref{sec:endianness}); esso è
706 composto da un parte di rete data dal campo \var{s\_net}, che può assumere il
707 valore \constd{AT\_ANYNET}, che indica una rete generica e vale anche per
708 indicare la rete su cui si è, il singolo nodo è indicato da \var{s\_node}, e
709 può prendere il valore generico \constd{AT\_ANYNODE} che indica anche il nodo
710 corrente, ed il valore \constd{ATADDR\_BCAST} che indica tutti i nodi della
711 rete.
712
713
714 \subsection{La struttura degli indirizzi dei \textit{packet socket}}
715 \label{sec:sock_sa_packet}
716
717 I \textit{packet socket}, identificati dal dominio \const{AF\_PACKET}, sono
718 un'interfaccia specifica di Linux per inviare e ricevere pacchetti
719 direttamente su un'interfaccia di rete, senza passare per le funzioni di
720 gestione dei protocolli di livello superiore. In questo modo è possibile
721 implementare dei protocolli in user space, agendo direttamente sul livello
722 fisico. In genere comunque si preferisce usare la libreria
723 \file{pcap},\footnote{la libreria è mantenuta insieme al comando
724   \cmd{tcpdump}, informazioni e documentazione si possono trovare sul sito del
725   progetto \url{http://www.tcpdump.org/}.}  che assicura la portabilità su
726 altre piattaforme, anche se con funzionalità ridotte.
727
728 Questi socket possono essere di tipo \const{SOCK\_RAW} o \const{SOCK\_DGRAM}.
729 Con socket di tipo \const{SOCK\_RAW} si può operare sul livello di
730 collegamento, ed i pacchetti vengono passati direttamente dal socket al driver
731 del dispositivo e viceversa.  In questo modo, in fase di trasmissione, il
732 contenuto completo dei pacchetti, comprese le varie intestazioni, deve essere
733 fornito dall'utente. In fase di ricezione invece tutto il contenuto del
734 pacchetto viene passato inalterato sul socket, anche se il kernel analizza
735 comunque il pacchetto, riempiendo gli opportuni campi della struttura
736 \struct{sockaddr\_ll} ad esso associata.
737
738 Si usano invece socket di tipo \const{SOCK\_DGRAM} quando si vuole operare a
739 livello di rete. 
740
741 In questo caso in fase di ricezione l'intestazione del protocollo di
742 collegamento viene rimossa prima di passare il resto del pacchetto all'utente,
743 mentre in fase di trasmissione viene creata una opportuna intestazione per il
744 protocollo a livello di collegamento utilizzato, usando le informazioni
745 necessarie che devono essere specificate sempre con una struttura
746 \struct{sockaddr\_ll}.
747
748 Nella creazione di un \textit{packet socket} il valore dell'argomento
749 \param{protocol} di \func{socket} serve a specificare, in \textit{network
750   order}, il numero identificativo del protocollo di collegamento si vuole
751 utilizzare. I valori possibili sono definiti secondo lo standard IEEE 802.3, e
752 quelli disponibili in Linux sono accessibili attraverso opportune costanti
753 simboliche definite nel file \file{linux/if\_ether.h}. Se si usa il valore
754 speciale \constd{ETH\_P\_ALL} passeranno sul \textit{packet socket} tutti i
755 pacchetti, qualunque sia il loro protocollo di collegamento. Ovviamente l'uso
756 di questi socket è una operazione privilegiata e può essere effettuati solo da
757 un processo con i privilegi di amministratore (\ids{UID} effettivo nullo) o
758 con la \textit{capability} \const{CAP\_NET\_RAW}.
759
760 Una volta aperto un \textit{packet socket}, tutti i pacchetti del protocollo
761 specificato passeranno attraverso di esso, qualunque sia l'interfaccia da cui
762 provengono; se si vuole limitare il passaggio ad una interfaccia specifica
763 occorre usare la funzione \func{bind} (vedi sez.~\ref{sec:TCP_func_bind}) per
764 agganciare il socket a quest'ultima.
765
766 \begin{figure}[!htb]
767   \footnotesize \centering
768   \begin{minipage}[c]{\textwidth}
769     \includestruct{listati/sockaddr_ll.h}
770   \end{minipage} 
771   \caption{La struttura \structd{sockaddr\_ll} degli indirizzi dei
772     \textit{packet socket}.}
773   \label{fig:sock_sa_packet_struct}
774 \end{figure}
775
776 Nel caso dei \textit{packet socket} la struttura degli indirizzi è di tipo
777 \struct{sockaddr\_ll}, e la sua definizione è riportata in
778 fig.~\ref{fig:sock_sa_packet_struct}; essa però viene ad assumere un ruolo
779 leggermente diverso rispetto a quanto visto finora per gli altri tipi di
780 socket.  Infatti se il socket è di tipo \const{SOCK\_RAW} si deve comunque
781 scrivere tutto direttamente nel pacchetto, quindi la struttura non serve più a
782 specificare gli indirizzi. Essa mantiene questo ruolo solo per i socket di
783 tipo \const{SOCK\_DGRAM}, per i quali permette di specificare i dati necessari
784 al protocollo di collegamento, mentre viene sempre utilizzata in lettura (per
785 entrambi i tipi di socket), per la ricezione dei dati relativi a ciascun
786 pacchetto.
787
788 Al solito il campo \var{sll\_family} deve essere sempre impostato al valore
789 \constd{AF\_PACKET}. Il campo \var{sll\_protocol} indica il protocollo scelto,
790 e deve essere indicato in \textit{network order}, facendo uso delle costanti
791 simboliche definite in \file{linux/if\_ether.h}. Il campo \var{sll\_ifindex} è
792 l'indice dell'interfaccia (l'\textit{inxterface index} (vedi
793 sez.~\ref{sec:sock_ioctl_netdevice}) che in caso di presenza di più
794 interfacce dello stesso tipo (se ad esempio si hanno più schede Ethernet),
795 permette di selezionare quella con cui si vuole operare (un valore nullo
796 indica qualunque interfaccia).  Questi sono i due soli campi che devono essere
797 specificati quando si vuole selezionare una interfaccia specifica, usando
798 questa struttura con la funzione \func{bind}.
799
800 I campi \var{sll\_halen} e \var{sll\_addr} indicano rispettivamente
801 l'indirizzo associato all'interfaccia sul protocollo di collegamento e la
802 relativa lunghezza; ovviamente questi valori cambiano a seconda del tipo di
803 collegamento che si usa, ad esempio, nel caso di Ethernet, questi saranno il
804 MAC address della scheda e la relativa lunghezza. Essi vengono usati, insieme
805 ai campi \var{sll\_family} e \var{sll\_ifindex} quando si inviano dei
806 pacchetti, in questo caso tutti gli altri campi devono essere nulli.
807
808 Il campo \var{sll\_hatype} indica il tipo ARP, come definito in
809 \file{linux/if\_arp.h}, mentre il campo \var{sll\_pkttype} indica il tipo di
810 pacchetto; entrambi vengono impostati alla ricezione di un pacchetto ed han
811 senso solo in questo caso. In particolare \var{sll\_pkttype} può assumere i
812 seguenti valori: \constd{PACKET\_HOST} per un pacchetto indirizzato alla
813 macchina ricevente, \constd{PACKET\_BROADCAST} per un pacchetto di
814 \textit{broadcast}, \constd{PACKET\_MULTICAST} per un pacchetto inviato ad un
815 indirizzo fisico di \textit{multicast}, \constd{PACKET\_OTHERHOST} per un
816 pacchetto inviato ad un'altra stazione (e ricevuto su un'interfaccia in modo
817 promiscuo), \constd{PACKET\_OUTGOING} per un pacchetto originato dalla propria
818 macchina che torna indietro sul socket.
819
820 Si tenga presente infine che in fase di ricezione, anche se si richiede il
821 troncamento del pacchetto, le funzioni \func{recv}, \func{recvfrom} e
822 \func{recvmsg} (vedi sez.~\ref{sec:net_sendmsg}) restituiranno comunque la
823 lunghezza effettiva del pacchetto così come arrivato sulla linea.
824
825 %% \subsection{La struttura degli indirizzi DECnet}
826 %% \label{sec:sock_sa_decnet}
827  
828 %% I socket di tipo \const{AF\_DECnet} usano il protocollo DECnet, usato dai VAX
829 %% Digital sotto VMS quando ancora il TCP/IP non era diventato lo standard di
830 %% fatto. Il protocollo è un protocollo chiuso, ed il suo uso attuale è limitato
831 %% alla comunicazione con macchine che stanno comunque scomparendo. Lo si riporta
832 %% solo come esempio 
833
834
835 % TODO aggiungere AF_CAN, vedi http://lwn.net/Articles/253425, dal 2.6.25 ?
836
837 % TODO: trattare i socket RDS, vedi documentazione del kernel, file 
838 % Documentation/networking/rds.txt
839
840
841
842 \section{Le funzioni di conversione degli indirizzi}
843 \label{sec:sock_addr_func}
844
845 In questa sezione tratteremo delle varie funzioni usate per manipolare gli
846 indirizzi, limitandoci però agli indirizzi Internet.  Come accennato gli
847 indirizzi e i numeri di porta usati nella rete devono essere forniti nel
848 cosiddetto \textit{network order}, che corrisponde al formato \textit{big
849   endian} (vedi sez.~\ref{sec:endianness}), anche quando la proprio macchina
850 non usa questo formato, cosa che può comportare la necessità di eseguire delle
851 conversioni.
852
853
854 \subsection{Le funzioni per il riordinamento}
855 \label{sec:sock_func_ord}
856
857 Come già visto in sez.~\ref{sec:endianness} il problema connesso
858 all'\textit{endianness} è che quando si passano dei dati da un tipo di
859 architettura all'altra i dati vengono interpretati in maniera diversa, e ad
860 esempio nel caso dell'intero a 16 bit ci si ritroverà con i due byte in cui è
861 suddiviso scambiati di posto.  
862
863 Per questo motivo si usano delle funzioni di conversione che servono a tener
864 conto automaticamente della possibile differenza fra l'ordinamento usato sul
865 computer e quello che viene usato nelle trasmissione sulla rete; queste
866 funzioni sono \funcd{htonl}, \funcd{htons}, \funcd{ntohl} e \funcd{ntohs} ed i
867 rispettivi prototipi sono:
868
869 \begin{funcproto}{
870 \fhead{arpa/inet.h}
871 \fdecl{unsigned long int htonl(unsigned long int hostlong)}
872 \fdesc{Converte l'intero a 32 bit \param{hostlong} dal formato della macchina a
873   quello della rete.} 
874 \fdecl{unsigned short int htons(unsigned short int hostshort)}
875 \fdesc{Converte l'intero a 16 bit \param{hostshort} dal formato della macchina a
876   quello della rete.}
877 \fdecl{unsigned long int ntohl(unsigned long int netlong)}
878 \fdesc{Converte l'intero a 32 bit \param{netlong} dal formato della rete a
879   quello della macchina.}
880 \fdecl{unsigned sort int ntohs(unsigned short int netshort)}
881 \fdesc{Converte l'intero a 16 bit \param{netshort} dal formato della rete a
882   quello della macchina.}
883 }
884
885 {Tutte le funzioni restituiscono il valore convertito, e non prevedono
886   errori.}
887 \end{funcproto}
888
889 I nomi sono assegnati usando la lettera \texttt{n} come mnemonico per indicare
890 l'ordinamento usato sulla rete (da \textit{network order}) e la lettera
891 \texttt{h} come mnemonico per l'ordinamento usato sulla macchina locale (da
892 \textit{host order}), mentre le lettere \texttt{s} e \texttt{l} stanno ad
893 indicare i tipi di dato (\ctyp{long} o \ctyp{short}, riportati anche dai
894 prototipi).
895
896 Usando queste funzioni si ha la conversione automatica: nel caso in cui la
897 macchina che si sta usando abbia una architettura \textit{big endian} queste
898 funzioni sono definite come macro che non fanno nulla. Per questo motivo vanno
899 sempre utilizzate, anche quando potrebbero non essere necessarie, in modo da
900 assicurare la portabilità del codice su tutte le architetture.
901
902
903 \subsection{Le funzioni di conversione per gli indirizzi IPv4}
904 \label{sec:sock_func_ipv4}
905
906 Un secondo insieme di funzioni di manipolazione è quello che serve per passare
907 dalla rappresentazione simbolica degli indirizzi IP al formato binario
908 previsto dalla struttura degli indirizzi di
909 fig.~\ref{fig:sock_sa_ipv4_struct}, e viceversa. La notazione più comune è la
910 cosiddetta notazione \itindex{dotted-decimal} \textit{dotted-decimal}, che
911 prevede che gli indirizzi IPv4 siano indicati con l'espressione del valore
912 numerico decimale di ciascuno dei 4 byte che li costituiscono separati da un
913 punto (ad esempio \texttt{192.168.0.1}).
914
915 In realtà le funzioni che illustreremo supportano una notazione che più
916 propriamente dovrebbe esser chiamata \textit{numbers-and-dot} in quanto il
917 valore può essere indicato con numeri espressi sia in decimale, che in ottale
918 (se indicati apponendo uno zero) che in esadecimale (se indicati apponendo
919 \texttt{0x}). Inoltre per la parte meno significativa dell'espressione, quella
920 che riguarda l'indirizzo locale, si può usare, eliminando altrettanti punti,
921 valori a 16 o a 24 bit, e togliendo tutti i punti, si può usare anche
922 direttamente un valore numerico a 32 bit.\footnote{la funzionalità si trova
923   anche in gran parte dei programmi che usano indirizzi di rete, e deriva
924   direttamente da queste funzioni.}
925
926 Tradizionalmente la conversione di un indirizzo \textit{dotted-decimal} al
927 valore numerico veniva eseguita dalla funzione \funcd{inet\_addr} (prevista
928 fin dalle origini in BSD e inclusa in POSIX.1-2001) il cui prototipo è:
929
930 \begin{funcproto}{
931 \fhead{arpa/inet.h}
932 \fdecl{in\_addr\_t inet\_addr(const char *strptr)}
933 \fdesc{Converte la stringa dell'indirizzo \textit{dotted decimal} in nel
934   numero IP in network order.} 
935 }
936
937 {La funzione ritorna il valore dell'indirizzo in caso di successo e
938   \const{INADDR\_NONE} per un errore e non genera codici di errore.}
939 \end{funcproto}
940
941 La prima funzione, \func{inet\_addr}, restituisce l'indirizzo a 32 bit in
942 \textit{network order} (del tipo \type{in\_addr\_t}) a partire dalla stringa
943 passata nell'argomento \param{strptr}. In caso di errore (quando la stringa
944 non esprime un indirizzo valido) restituisce invece il valore
945 \const{INADDR\_NONE}, che tipicamente sono trentadue bit a uno.  Questo però
946 comporta che la stringa \texttt{255.255.255.255}, che pure è un indirizzo
947 valido, non può essere usata con questa funzione dato che genererebe comunque
948 un errore; per questo motivo essa è generalmente deprecata in favore di
949 \func{inet\_aton}.
950
951 Per effettuare la conversione inversa la funzione usata tradizionalmente è
952 \funcd{inet\_ntoa}, anch'essa presente fin da BSD 4.3, in cui si riprende la
953 notazione già vista in sez.~\ref{sec:sock_func_ord} che usa la lettera
954 \texttt{n} come mnemonico per indicare la rete ed \texttt{a} (per ASCII) come
955 mnemonico per indicare la stringa corrispodente all'indirizzo; il suo
956 prototipo è:
957
958 \begin{funcproto}{
959 \fhead{arpa/inet.h}
960 \fdecl{char *inet\_ntoa(struct in\_addr addrptr)}
961 \fdesc{Converte un indirizzo IP in una stringa \textit{dotted decimal}.} 
962 }
963
964 {La funzione l'indirizzo della stringa con il valore dell'indirizzo convertito
965   e non prevede errori.}
966 \end{funcproto}
967
968 La funzione converte il valore a 32 bit dell'indirizzo, espresso in
969 \textit{network order}, e preso direttamente con un puntatore al relativo
970 campo della struttura degli indirizzi, restituendo il puntatore alla stringa
971 che contiene l'espressione in formato \textit{dotted-decimal}. Si deve tenere
972 presente che la stringa risiede in un segmento di memoria statica, per cui
973 viene riscritta ad ogni chiamata e la funzione non è rientrante.
974
975 Per rimediare ai problemi di \funcd{inet\_addr} è stata sostituita da
976 \funcd{inet\_aton}, che però non è stata standardizzata e non è presente in
977 POSIX.1-2001, anche se è definita sulla gran parte dei sistemi Unix; il suo
978 prototipo è:
979
980 \begin{funcproto}{
981 \fhead{arpa/inet.h}
982 \fdecl{int inet\_aton(const char *src, struct in\_addr *dest)}
983 \fdesc{Converte la stringa dell'indirizzo \textit{dotted decimal} in un
984   indirizzo IP.}
985 }
986
987 {La funzione ritorna un valore non nullo in caso di successo e $0$ per un
988   errore e non genera codici di errore.}
989 \end{funcproto}
990
991 La funzione converte la stringa puntata da \param{src} nell'indirizzo binario
992 che viene memorizzato nell'opportuna struttura \struct{in\_addr} (si veda
993 fig.~\ref{fig:sock_sa_ipv4_struct}) situata all'indirizzo dato
994 dall'argomento \param{dest} (è espressa in questa forma in modo da poterla
995 usare direttamente con il puntatore usato per passare la struttura degli
996 indirizzi). La funzione restituisce un valore diverso da zero se l'indirizzo è
997 valido e la conversione ha successo e 0 in caso contrario. Se usata
998 con \param{dest} inizializzato a \val{NULL} può essere usata per effettuare la
999 validazione dell'indirizzo espresso da \param{src}.
1000
1001 Oltre a queste tre funzioni esistono le ulteriori \funcm{inet\_lnaof},
1002 \funcm{inet\_netof} e \funcm{inet\_makeaddr} che assumono la ormai obsoleta e
1003 deprecata suddivisione in classi degli indirizzi IP per fornire la parte di
1004 rete e quella di indirizzo locale. Ad oggi il loro uso non ha più alcun senso
1005 per ciò non le tratteremo.
1006
1007
1008 \subsection{Le funzioni di conversione per indirizzi IP generici}
1009 \label{sec:sock_conv_func_gen}
1010
1011 Le tre funzioni precedenti sono limitate solo ad indirizzi IPv4, per questo
1012 motivo è preferibile usare le due nuove funzioni \func{inet\_pton} e
1013 \func{inet\_ntop} che possono convertire anche gli indirizzi IPv6. Anche in
1014 questo caso le lettere \texttt{n} e \texttt{p} sono degli mnemonici per
1015 ricordare il tipo di conversione effettuata e stanno per \textit{presentation}
1016 e \textit{numeric}.
1017
1018 Entrambe le funzioni accettano l'argomento \param{af} che indica il tipo di
1019 indirizzo, e che può essere soltanto \const{AF\_INET} o \const{AF\_INET6}. La
1020 prima funzione, \funcd{inet\_pton}, serve a convertire una stringa in un
1021 indirizzo; il suo prototipo è:
1022
1023 \begin{funcproto}{
1024 \fhead{sys/socket.h}
1025 \fdecl{int inet\_pton(int af, const char *src, void *addr\_ptr)} 
1026 \fdesc{Converte l'indirizzo espresso tramite una stringa nel valore numerico.} 
1027 }
1028
1029 {La funzione ritorna $1$ in caso di successo, $0$ se \param{src} non contiene
1030   una rappresentazione valida per la famiglia di indirizzi indicati
1031   da \param{af} e $-1$ se \param{af} specifica una famiglia di indirizzi non
1032   valida, e solo in quest'ultimo caso  \var{errno} assumerà il valore
1033   \errcode{EAFNOSUPPORT}.
1034 }
1035 \end{funcproto}
1036
1037 La funzione converte la stringa indicata tramite \param{src} nel valore
1038 numerico dell'indirizzo IP del tipo specificato da \param{af} che viene
1039 memorizzato all'indirizzo puntato da \param{addr\_ptr}. La funzione supporta
1040 per IPv4 la sola notazione \textit{dotted-decimal}, e non quella più completa
1041 \textit{number-and-dot} che abbiamo visto per \func{inet\_aton}. Per IPv6 la
1042 notazione prevede la suddivisione dei 128 bit dell'indirizzo in 16 parti di 16
1043 bit espresse con valori esadecimali separati dal carattere ``\texttt{:}'' ed
1044 una serie di valori nulli possono essere sostituiti (una sola volta, sempre a
1045 partire dalla sinistra) con la notazione ``\texttt{::}'', un esempio di
1046 indirizzo in questa forma potrebbe essere \texttt{2001:db8::8:ba98:2078:e3e3},
1047 per una descrizione più completa si veda sez.~\ref{sec:IP_ipv6_notation}.
1048
1049 La seconda funzione di conversione è \funcd{inet\_ntop} che converte un
1050 indirizzo in una stringa; il suo prototipo è:
1051
1052 \begin{funcproto}{
1053 \fhead{sys/socket.h}
1054 \fdecl{char *inet\_ntop(int af, const void *addr\_ptr, char *dest, size\_t len)}
1055 \fdesc{Converte l'indirizzo dalla relativa struttura in una stringa simbolica.} 
1056 }
1057
1058 {La funzione ritorna un puntatore non nullo alla stringa convertita in caso di
1059   successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
1060   dei valori:
1061   \begin{errlist}
1062     \item[\errcode{ENOSPC}] le dimensioni della stringa con la conversione
1063       dell'indirizzo eccedono la lunghezza specificata da \param{len}.
1064     \item[\errcode{ENOAFSUPPORT}] la famiglia di indirizzi \param{af} non è
1065       una valida.
1066   \end{errlist}
1067 }
1068 \end{funcproto}
1069
1070
1071 La funzione converte la struttura dell'indirizzo puntata da \param{addr\_ptr}
1072 in una stringa che viene copiata nel buffer puntato dall'indirizzo
1073 \param{dest}; questo deve essere preallocato dall'utente e la lunghezza deve
1074 essere almeno \constd{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e
1075 \constd{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
1076 comunque essere specificata con il parametro \param{len}.
1077
1078 Gli indirizzi vengono convertiti da/alle rispettive strutture di indirizzo
1079 (una struttura \struct{in\_addr} per IPv4, e una struttura \struct{in6\_addr}
1080 per IPv6), che devono essere precedentemente allocate e passate attraverso il
1081 puntatore \param{addr\_ptr}; l'argomento \param{dest} di \func{inet\_ntop} non
1082 può essere nullo e deve essere allocato precedentemente.
1083
1084
1085
1086
1087
1088 % LocalWords:  socket sez cap BSD SVr XTI Transport Interface TCP stream UDP PF
1089 % LocalWords:  datagram broadcast descriptor sys int domain type protocol errno
1090 % LocalWords:  EPROTONOSUPPORT ENFILE kernel EMFILE EACCES EINVAL ENOBUFS raw
1091 % LocalWords:  ENOMEM table family AF address name glibc UNSPEC LOCAL Local IPv
1092 % LocalWords:  communication INET protocols ip AX Amateur IPX Novell APPLETALK
1093 % LocalWords:  Appletalk ddp NETROM NetROM Multiprotocol ATMPVC Access to ATM
1094 % LocalWords:  PVCs ITU ipv PLP DECnet Reserved for project NETBEUI LLC KEY key
1095 % LocalWords:  SECURITY Security callback NETLINK interface device netlink Low
1096 % LocalWords:  PACKET level packet ASH Ash ECONET Acorn Econet ATMSVC SVCs SNA
1097 % LocalWords:  IRDA PPPOX PPPoX WANPIPE Wanpipe BLUETOOTH Bluetooth POSIX bits
1098 % LocalWords:  dall'header tab SOCK capabilities capability styles DGRAM read
1099 % LocalWords:  SEQPACKET RDM sockaddr reference void fig Header uint socklen at
1100 % LocalWords:  addr netinet port len Stevens unsigned short casting nell'header
1101 % LocalWords:  BIND SERVICE bind union order big endian flowinfo dell'header ll
1102 % LocalWords:  multicast multicasting local socketpair sun path filesystem AARP
1103 % LocalWords:  pathname AppleTalk netatalk personal Apple ATPROTO atalk sat if
1104 % LocalWords:  ANYNET node ANYNODE ATADDR BCAST pcap IEEE linux ether ETH ALL
1105 % LocalWords:  sll ifindex ethernet halen MAC hatype ARP arp pkttype HOST recv
1106 % LocalWords:  OTHERHOST OUTGOING recvfrom recvmsg endianness little endtest Mac
1107 % LocalWords:  Intel Digital Motorola IBM VME PowerPC l'Intel xABCD ptr htonl
1108 % LocalWords:  htons ntohl ntohs long hostlong hostshort netlong
1109 % LocalWords:  sort netshort host inet aton ntoa dotted decimal const char src
1110 % LocalWords:  strptr struct dest addrptr INADDR NULL pton ntop presentation af
1111 % LocalWords:  numeric EAFNOSUPPORT size ENOSPC ENOAFSUPPORT ADDRSTRLEN ROUTE
1112 % LocalWords:  of tcpdump page
1113
1114
1115 %%% Local Variables: 
1116 %%% mode: latex
1117 %%% TeX-master: "gapil"
1118 %%% End: