3 %% Copyright (C) 2004 Simone Piccardi. Permission is granted to
4 %% copy, distribute and/or modify this document under the terms of the GNU Free
5 %% Documentation License, Version 1.1 or any later version published by the
6 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
7 %% with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the
8 %% license is included in the section entitled "GNU Free Documentation
11 \chapter{La gestione dei socket}
12 \label{cha:sock_generic_management}
14 Esamineremo in questo capitolo una serie di funzionalità aggiuntive relative
15 alla gestione dei socket, come la gestione della risoluzione di nomi e
16 indirizzi, le impostazioni delle varie proprietà ed opzioni relative ai
17 socket, e le funzioni di controllo che permettono di modificarne il
21 \section{La risoluzione dei nomi}
22 \label{sec:sock_name_resolution}
24 Negli esempi dei capitoli precedenti abbiamo sempre identificato le singole
25 macchine attraverso indirizzi numerici, sfruttando al più le funzioni di
26 conversione elementare illustrate in sez.~\ref{sec:sock_addr_func} che
27 permettono di passare da un indirizzo espresso in forma dotted decimal ad un
28 numero. Vedremo in questa sezione le funzioni utilizzate per poter utilizzare
29 dei nomi simbolici al posto dei valori numerici, e viceversa quelle che
30 permettono di ottenere i nomi simbolici associati ad indirizzi, porte o altre
31 proprietà del sistema.
34 \subsection{La struttura del \textit{resolver}}
35 \label{sec:sock_resolver}
37 La risoluzione dei nomi è associata tradizionalmente al servizio del
38 \textit{Domain Name Service} che permette di identificare le macchine su
39 internet invece che per numero IP attraverso il relativo \textsl{nome a
40 dominio}.\footnote{non staremo ad entrare nei dettagli della definizione di
41 cosa è un nome a dominio, dandolo per noto, una introduzione alla
42 problematica si trova in \cite{AGL} (cap. 9) mentre per una trattazione
43 approfondita di tutte le problematiche relative al DNS si può fare
44 riferimento a \cite{DNSbind}.} In realtà per DNS si intendono spesso i
45 server che forniscono su internet questo servizio, mentre nel nostro caso
46 affronteremo la problematica dal lato client, di un qualunque programma che
47 necessita di compiere questa operazione.
51 \includegraphics[width=10cm]{img/resolver}
52 \caption{Schema di funzionamento delle routine del \textit{resolver}.}
53 \label{fig:sock_resolver_schema}
56 Inoltre quella fra nomi a dominio e indirizzi IP non è l'unica corrispondenza
57 possibile fra nomi simbolici e valori numerici, come abbiamo visto anche in
58 sez.~\ref{sec:sys_user_group} per le corrispondenze fra nomi di utenti e
59 gruppi e relativi identificatori numerici; per quanto riguarda però tutti i
60 nomi associati a identificativi o servizi relativi alla rete il servizio di
61 risoluzione è gestito in maniera unificata da un insieme di routine fornite
62 con le librerie del C, detto appunto \textit{resolver}.
64 Lo schema di funzionamento del \textit{resolver} è illustrato in
65 fig.~\ref{fig:sock_resolver_schema}; in sostanza i programmi hanno a
66 disposizione un insieme di funzioni di libreria con cui chiamano il
67 \textit{resolver}, indicate con le freccie nere. Ricevuta la richiesta è
68 quest'ultimo che, sulla base della sua configurazione, esegue le operazioni
69 necessarie a fornire la risposta, che possono essere la lettura delle
70 informazioni mantenute nei relativi dei file statici presenti sulla macchina,
71 una interrogazione ad un DNS (che a sua volta, per il funzionamento del
72 protocollo può interrogarene altri) o la richiesta ad altri server per i quali
73 sia fornito il supporto, come LDAP.\footnote{la sigla LDAP fa riferimento ad
74 un protocollo, il \textit{Lightweight Directory Access Protocol}, che
75 prevede un meccanismo per la gestione di \textsl{elenchi} di informazioni
76 via rete; il contenuto di un elenco può essere assolutamente generico, e
77 questo permette il manenimento dei più vari tipi di informazioni su una
78 infrastruttura di questo tipo.}
80 La configurazione del \textit{resolver} attiene più alla amministrazione di
81 sistema che alla programmazione, ciò non di meno, prima di trattare le varie
82 funzioni di librerie utilizzate dai programmi, vale la pena fare una
83 panoramica generale. Originariamente la configurazione del \textit{resolver}
84 riguardava esclusivamente le questioni relative alla gestione dei nomi a
85 dominio, e prevedeva solo l'utilizzo del DNS e del file statico
88 Per questo aspetto il file di configurazione principale del sistema è
89 \file{/etc/resolv.conf} che contiene in sostanza l'elenco degli indirizzi IP
90 dei server DNS da contattare; a questo si affianca il file
91 \file{/etc/host.conf} il cui scopo principale è indicare l'ordine in cui
92 eseguire la risoluzione dei nomi (se usare prima i valori di \file{/etc/hosts}
93 o quelli del DNS). Tralasciamo i dettagli relativi alle varie direttive che
94 possono essere usate in questi file, che si trovano nelle rispettive pagine di
97 Con il tempo però è divenuto possibile fornire diversi sostituti per
98 l'utilizzo delle associazione statiche in \file{/etc/hosts}, inoltre oltre
99 alla risoluzione dei nomi a dominio ci sono anche altri nomi da risolvere,
100 come quelli che possono essere associati ad una rete (invece che ad una
101 singola macchina) o ai gruppi di macchine definiti dal servizio
102 NIS,\footnote{il \textit{Network Information Service} è un servizio, creato da
103 Sun, e poi diffuso su tutte le piattaforme unix-like, che permette di
104 raggruppare all'interno di una rete (in quelli che appunto vengono chiamati
105 \textit{netgroup}) varie macchine, centralizzando i servizi di definizione
106 di utenti e gruppi e di autenticazione, oggi è sempre più spesso sostituito
107 da LDAP.} o come quelli dei protocolli e dei servizi che sono mantenuti nei
108 file statici \file{/etc/protocols} e \file{/etc/services}. Molte di queste
109 informazioni non si trovano su un DNS, ma in una rete locale può essere molto
110 utile centralizzare il mentenimento di alcune di esse su opportuni server.
111 Inoltre l'uso di diversi supporti possibili per le stesse informazioni (ad
112 esempio il nome delle macchine può essere mantenuto sia tramite
113 \file{/etc/hosts}, che con il DNS, che con NIS) comporta il problema
114 dell'ordine in cui questi vengono interrogati.\footnote{con le implementazioni
115 classiche i vari supporti erano introdotti modificando direttamente le
116 funzioni di liberia, prevedendo un ordine di interrogazione predefinito e
117 non modificabile (a meno di una ricompilazione delle librerie stesse).}
119 Per risolvere questa serie di problemi la risoluzione dei nomi a dominio
120 eseguira dal \textit{resolver} è stata inclusa all'interno di un meccanismo
121 generico per la risoluzione di corripondenze fra nomi ed informazioni ad essi
122 associate chiamato \textit{Name Service Switch}\footnote{il sistema è stato
123 introdotto la prima volta nelle librerie standard di Solaris, le \acr{glibc}
124 hanno ripreso lo stesso schema, si tenga presente che questo sistema non
125 esiste per altre librerie standard come le \acr{libc5} o le \acr{uclib}.}
126 cui abbiamo accennato anche in sez.~\ref{sec:sys_user_group} per quanto
127 riguarda la gestione dei dati associati a utenti e gruppi. Il \textit{Name
128 Service Switch} (cui spesso si fa riferimento con l'acronimo NSS) è un
129 sistema di librerie dinamiche che permette di definire in maniera generica sia
130 i supporti su cui mantenere i dati di corrispondenza fra nomi e valori
131 numerici, sia l'ordine in cui effettuare le ricerche sui vari supporti
132 disponibili. Il sistema prevede una serie di possibili classi di
133 corrispondenza, quelle attualmente definite sono riportate in
134 tab.~\ref{tab:sys_NSS_classes}.
139 \begin{tabular}[c]{|l|p{8cm}|}
141 \textbf{Classe} & \textbf{Tipo di corrispondenza}\\
144 \texttt{shadow} & corrispondenze fra username e proprietà dell'utente
146 \texttt{group} & corrispondenze fra nome del gruppo e proprietà dello
148 \texttt{aliases} & alias per la posta elettronica\\
149 \texttt{ethers} & corrispondenze fra numero IP e MAC address della
151 \texttt{hosts} & corrispondenze fra nome a dominio e numero IP.\\
152 \texttt{netgroup} & corrispondenze gruppo di rete e macchine che lo
154 \texttt{networks} & corrispondenze fra nome di una rete e suo indirizzo
156 \texttt{protocols}& corrispondenze fra nome di un protocollo e relativo
157 numero identificativo.\\
158 \texttt{rpc} & corrispondenze fra nome di un servizio RPC e relativo
159 numero identificativo.\\
160 \texttt{services} & corrispondenze fra nome di un servizio e numero di
164 \caption{Le diverse classi di corrispondenze definite
165 all'interno del \textit{Name Service Switch}.}
166 \label{tab:sys_NSS_classes}
169 Il sistema del \textit{Name Service Switch} è controllato dal contenuto del
170 file \file{/etc/nsswitch.conf}; questo contiene una riga\footnote{seguendo una
171 convezione comune per i file di configurazione le righe vuote vengono
172 ignorate e tutto quello che segue un carattere ``\texttt{\#}'' viene
173 considerato un commento.} di configurazione per ciascuna di queste classi,
174 che viene inizia col nome di tab.~\ref{tab:sys_NSS_classes} seguito da un
175 carattere ``\texttt{:}'' e prosegue con la lista dei \textsl{servizi} su cui
176 le relative informazioni sono raggiungibili, scritti nell'ordine in cui si
177 vuole siano interrogati.
179 Ogni servizio è specificato a sua volta da un nome, come \texttt{file},
180 \texttt{dns}, \texttt{db}, ecc. che identifica la libreria dinamica che
181 realizza l'interfaccia con esso. Per ciascun servizio se \texttt{NAME} è il
182 nome utilizzato dentro \file{/etc/nsswitch.conf}, dovrà essere presente
183 (usualmente in \file{/lib}) una libreria \texttt{libnss\_NAME} che ne
184 implementa le funzioni.
186 In ogni caso, qualunque sia la modalità con cui ricevono i dati o il supporto
187 su cui vengono mantenuti, e che si usino o meno funzionalità aggiuntive
188 fornire dal sistema del \textit{Name Service Switch}, dal punto di vista di un
189 programma che deve effettuare la risoluzione di un nome a dominio, tutto
190 quello che conta sono le funzioni classiche che il \textit{resolver} mette a
191 disposizione,\footnote{è cura della implementazione fattane nelle \acr{glibc}
192 tenere conto della presenza del \textit{Name Service Switch}.} e sono queste
193 quelle che tratteremo nelle sezioni successive.
196 \subsection{Le funzioni di interrogazione del \textit{resolver}}
197 \label{sec:sock_resolver_functions}
199 Prima di trattare le funzioni usate normalmente nella risoluzione dei nomi a
200 dominio conviene trattare in maniera più dettagliata il meccanismo principale
201 da esse utilizzato e cioè quello del servizio DNS. Come accennato questo,
202 benché in teoria sia solo uno dei possibili supporti su cui mantenere le
203 informazioni, in pratica costituisce il meccanismo principale con cui vengono
204 risolti i nomi a dominio. Per questo motivo esistono una serie di funzioni di
205 libreria che servono specificamente ad esseguire delle interrogazioni verso un
206 server DNS, funzioni che poi vengono utilizzate per realizzare le funzioni
207 generiche di libreria usate anche dal sistema del \textit{resolver}.
209 Il sistema del DNS è in sostanza di un database distribuito organizzato in
210 maniera gerarchica, i dati vengono mantenuti in tanti server distinti ciascuno
211 dei quali si occupa della risoluzione del proprio \textsl{dominio}; i nomi a
212 dominio sono organizzati in una struttura ad albero analoga a quella
213 dell'albero dei file, con domini di primo livello (come i \texttt{.org}),
214 secondo livello (come \texttt{.truelite.it}), ecc. In questo caso le
215 separazioni sono fra i vari livelli sono definite dal carattere ``\texttt{.}''
216 ed i nomi devono essere risolti da destra verso sinistra.\footnote{per chi si
217 stia chiedendo quale sia la radice di questo albero, cioè l'equivalente di
218 ``\texttt{/}'', la risposta è il dominio speciale ``\texttt{.}'', che in
219 genere non viene mai scritto esplicitamente, ma che, come chiunque abbia
220 configurato un server DNS sa bene, esiste ed è gestito dai cosiddetti
221 \textit{root DNS} che risolvono i domini di primo livello.} Il meccanismo
222 funziona con il criterio della \textsl{delegazione}, un server responsabile
223 per un dominio di primo livello può delegare la risoluzione degli indirizzi
224 per un suo dominio di secondo livello ad un altro server, il quale a sua volta
225 potrà delegare la risoluzione di un eventuale sottodominio di terzo livello ad
226 un altro server ancora.
228 In realtà un server DNS è in grado di fare altro rispetto alla risoluzione di
229 un nome a dominio in un indirizzo IP; ciascuna voce nel database viene
230 chiamata \textit{resource record}, e può contenere diverse informazioni; in
231 genere i \textit{resource record} vengono classificati per la \textsl{classe
232 di indirizzi} cui i dati contenuti fanno riferimento, e per il \textsl{tipo}
233 di questi ultimi. Oggigiorno i dati mantenuti nei server DNS sono
234 sostanzialmente relativi soltanto ad indirizzi internet, per cui in pratica
235 c'è soltanto una classe di indirizzi utilizzata, i dati invece possono essere
236 di vario tipo, uno dei quali è appunto la corrispondenza fra nome a dominio e
239 L'esistenza di vari tipi di informazioni è un'altro dei motivi per cui il
240 \textit{resolver} prevede, rispetto a quelle relative alla semplice
241 risoluzione dei nomi, un insieme di funzioni specifiche dedicate
242 all'interrogazione di un server DNS; la prima di queste funzioni è
243 \funcd{res\_init}, il cui prototipo è:
245 \headdecl{netinet/in.h} \headdecl{arpa/nameser.h} \headdecl{resolv.h}
246 \funcdecl{int res\_init(void)}
248 Inizializza il sistema del \textit{resolver}.
250 \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
254 La funzione legge il contenuto dei file di configurazione (i già citati
255 \file{resolv.conf} e \file{host.conf}) per impostare il dominio di default,
256 gli indirizzi dei server DNS da contattare e l'ordine delle ricerche; se non
257 sono specificati server verrà utilizzato l'indirizzo locale, e se non è
258 definito un dominio di default sarà usato quello associato con l'indirizzo
259 locale (ma questo può essere sovrascritto con l'uso della variabile di
260 ambiente \texttt{LOCALDOMAIN}). In genere è necessario eseguire questa
261 funzione direttamente in quanto viene automaticamente chiamata la prima che si
262 esegue una delle altre.
264 Le impostazioni del resolver e lo stato del sistema vengono mantenute in una
265 serie di variabili contenute in una apposita struttura interna che viene
266 definita in \file{resolv.h} ed è utilizzata come variabile globale, così che
267 anche un programma vi può accedure una volta che essa sia stata opportunamente
268 dichiarata come: \includecodesnip{listati/resolv_option.c}
270 Tutti i campi della struttura sono ad uso interno, e vengono usualmente
271 inizializzati da \func{res\_init} in base al contenuto dei file di
272 configurazione e ad una serie di valori di default. L'unico campo che può
273 essere utile modificare è \var{\_res.options}, una maschera binaria che
274 contiene una serie di bit di opzione che permettono di controllare il
275 comportamento del resolver.
280 \begin{tabular}[c]{|l|p{8cm}|}
282 \textbf{Costante} & \textbf{Significato} \\
285 \const{RES\_INIT} & viene attivato se è stata chiamata
287 \const{RES\_DEBUG} & stampa dei messaggi di debug.\\
288 \const{RES\_AAONLY} & accetta solo risposte autoritative.\\
289 \const{RES\_USEVC} & usa connessioni TCP per contattare i server
290 invece che l'usuale UDP.\\
291 \const{RES\_PRIMARY} & interroga soltanto server DNS primari.
293 \const{RES\_IGNTC} & ignora gli errori di troncamento, non ritenta la
294 richiesta con una connessione TCP.\\
295 \const{RES\_RECURSE} & imposta il bit che indica che si desidera
296 eseguire una interrogazione ricorsiva.\\
297 \const{RES\_DEFNAMES} & se attivo \func{res\_search} aggiunge il nome
298 del dominio di default ai nomi singoli (che non
299 contengono cioè un ``\texttt{.}'').\\
300 \const{RES\_STAYOPEN} & usato con \const{RES\_USEVC} per mantenere
301 aperte le connesioni TCP fra interrogazioni
303 \const{RES\_DNSRCH} & se attivo \func{res\_search} esegue le ricerche
304 di nomi di macchine nel dominio corrente o nei
305 domini ad esso sovrastanti.\\
306 \const{RES\_INSECURE1} & blocca i controlli di sicurezza di tipo 1.\\
307 \const{RES\_INSECURE2} & blocca i controlli di sicurezza di tipo 2.\\
308 \const{RES\_NOALIASES} & blocca l'uso della variabile di ambiente
309 \texttt{HOSTALIASES}.\\
310 \const{RES\_USE\_INET6} & restituisce indirizzi IPv6 con
311 \func{gethostbyname}. \\
312 \const{RES\_ROTATE} & ruota la lista dei server DNS dopo ogni
314 \const{RES\_NOCHECKNAME}& non controlla i nomi per verificarne la
315 correttezza sintattica. \\
316 \const{RES\_KEEPTSIG} & non elimina i record di tipo \texttt{TSIG}.\\
317 \const{RES\_BLAST} & \\
318 \const{RES\_DEFAULT} & è l'insieme di \const{RES\_RECURSE},
319 \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}.\\
322 \caption{Costanti utilizzabili come valori per \var{\_res.options}.}
323 \label{tab:resolver_option}
326 Per utilizzare questa funzionalità per modificare le impostazioni direttamente
327 da programma occorrerà impostare un opportuno valore per questo campo ed
328 invocare esplicitamente \func{res\_init}, dopo di che le altre funzioni
329 prenderanno le nuove impostazioni. Le costanti che definiscono i vari bit di
330 questo campo, ed il relativo significato sono illustrate in
331 tab.~\ref{tab:resolver_option}; trattandosi di una maschera binaria un valore
332 deve essere espresso con un opportuno OR aritmetico di dette costanti; ad
333 esempio il valore di default delle opzioni, epsresso dalla costante
334 \const{RES\_DEFAULT}, è definito come:
335 \includecodesnip{listati/resolv_option_def.c}
337 Non tratteremo il significato degli altri campi non essendovi necessità di
338 modificarli direttamente; gran parte di essi sono infatti impostati dal
339 contenuto dei file di configurazione, mentre le funzionalità controllate da
340 alcuni di esse possono essere modificate con l'uso delle opportune variabili
341 di ambiente come abbiamo visto per \texttt{LOCALDOMAIN}. In particolare con
342 \texttt{RES\_RETRY} si soprassiede il valore del campo \var{retry} che
343 controlla quante volte viene ripetuto il tentativo di connettersi ad un server
344 DNS prima di dichiarare fallimento; il valore di default è 4, un valore nullo
345 significa bloccare l'uso del DNS. Infine con \texttt{RES\_TIMEOUT} si
346 soprassiede il valore del campo \var{retrans},\footnote{preimpostato al valore
347 della omonima costante \const{RES\_TIMEOUT} di \file{resolv.h}.} che è il
348 valore preso come base (in numero di secondi) per definire la scadenza di una
349 richiesta, ciascun tentativo di richiesta fallito viene ripetuto raddoppianto
350 il tempo di scadenza per il numero massimo di volte stabilito da
353 La funzione di interrogazione principale è \funcd{res\_query}, che serve ad
354 eseguire una richiesta ad un server DNS per un nome a dominio
355 \textsl{completamente specificato} (quello che si chiama FQDN, \textit{Fully
356 Qualified Domain Name}); il suo prototipo è:
359 \headdecl{netinet/in.h}
360 \headdecl{arpa/nameser.h}
362 \funcdecl{int res\_query(const char *dname, int class, int type,
363 unsigned char *answer, int anslen)}
365 Esegue una interrogazione al DNS.
367 \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
368 dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
372 La funzione esegue una interrogazione ad un server DNS relativa al nome da
373 risolvere passato nella stringa indirizzata da \param{dname}, inoltre deve
374 essere specificata la classe di indirizzi in cui eseguire la ricerca con
375 \param{class}, ed il tipo di \textit{resource record} che si vuole ottenere
376 con \param{type}. Il risultato della ricerca verrà scritto nel buffer di
377 lunghezza \param{anslen} puntato da \param{answer} che si sarà opportunamente
378 allocato in precedenza.
381 Una seconda funzione di ricerca, analoga a \func{res\_query}, e che prende gli
382 stessi argomenti, ma esegue l'interrogazione con le funzionalità addizionali
383 previste dalle due opzioni \const{RES\_DEFNAMES} e \const{RES\_DNSRCH}, è
384 \funcd{res\_search}, il cui prototipo è:
386 \headdecl{netinet/in.h}
387 \headdecl{arpa/nameser.h}
389 \funcdecl{int res\_search(const char *dname, int class, int type,
390 unsigned char *answer, int anslen)}
392 Esegue una interrogazione al DNS.
394 \bodydesc{La funzione restituisce un valore positivo pari alla lunghezza dei
395 dati scritti nel buffer \param{answer} in caso di successo e -1 in caso di
399 In sostanza la funzione ripete una serie di chiamate a \func{res\_query}
400 aggiungendo opportunamente il dominio di default da cercare nella stinga
401 \param{dname}, fermandosi non appena trova un risultato. Il risultato di
402 entrambe le funzioni viene scritto nel formato opportuno (che sarà diverso a
403 seconda del tipo di record richiesto) nel buffer di ritorno; sarà compito del
404 programma (o di altre funzioni) estrarre i relativi dati, esistono una serie
405 di funzioni interne usate per la scansione di questi dati, per chi fosse
406 interessato una trattazione dettagliata è riportata nel capitolo 14 di
409 Le classi di indirizzi supportate da un server DNS sono tre, ma di queste in
410 pratica oggi viene utilizzata solo quella degli indirizzi internet; le
411 costanti che identificano dette classi come valore per l'argomento
412 \param{class} sono riportate in
413 tab.~\ref{tab:DNS_address_class}.\footnote{esisteva in realtà anche una classe
414 \const{C\_CSNET} per la omonima rete, ma è stata dichiarata obsoleta.}
419 \begin{tabular}[c]{|l|p{8cm}|}
421 \textbf{Costante} & \textbf{Significato} \\
424 \const{C\_IN} & indirizzi internet, in pratica i soli utilizzati oggi.\\
425 \const{C\_HS} & indirizzi \textit{Hesiod}, utilizzati solo al MIT, oggi
426 completamente estinti. \\
427 \const{C\_CHAOS}& indizzi per la rete \textit{Chaosnet}, un'altra rete
428 sperimentale nata al MIT. \\
429 \const{C\_ANY} & indica un indirizzo di classe qualunque.\\
432 \caption{Costanti identificative delle classi di indirizzi per l'argomento
433 \param{class} di \func{res\_query}.}
434 \label{tab:DNS_address_class}
437 Come accennato le tipologie di dati che sono mantenibili su un DNS sono
438 diverse, ed a ciascuna di essa corriponde ad un diverso tipo di
439 \textit{resource record}; l'elenco dei valori possibili\footnote{come
440 ottenibile dai file di dichiarazione \file{arpa/nameser.h} e
441 \file{arpa/nameser_compat.h}.} che si possono indicare per l'argomento
442 \param{type} è riportato in tab.~\ref{tab:DNS_record_type}; le costanti (tolto
443 il \texttt{T\_} iniziale) usano gli stessi valori usati per identificare i
444 record nei file di zona di BIND, e che normalmente sono anche usati come
445 \textsl{nomi} per indicare i record.
450 \begin{tabular}[c]{|l|l|}
452 \textbf{Costante} & \textbf{Significato} \\
455 \const{T\_A} & indirizzo di una stazione.\\
456 \const{T\_NS} & server DNS autoritativo per il dominio richiesto.\\
457 \const{T\_MD} & destinazione per la posta elettronica.\\
458 \const{T\_MF} & redistributore per la posta elettronica.\\
459 \const{T\_CNAME} & nome canonico.\\
460 \const{T\_SOA} & inzio di una zona di autorità.\\
461 \const{T\_MB} & nome a dominio di una casella di posta.\\
462 \const{T\_MG} & nome di un membro di un gruppo di posta.\\
463 \const{T\_MR} & nome di un cambiamento di nome per la posta.\\
464 \const{T\_NULL} & record nullo.\\
465 \const{T\_WKS} & servizio noto.\\
466 \const{T\_PTR} & risoluzione inversa di un indirizzo numerico.\\
467 \const{T\_HINFO} & informazione sulla stazione.\\
468 \const{T\_MINFO} & informazione sulla casella di posta.\\
469 \const{T\_MX} & server cui instradare la posta per il dominio.\\
470 \const{T\_TXT} & stringhe di testo (libere).\\
471 \const{T\_RP} & nome di un responsabile (\textit{responsible person}).\\
472 \const{T\_AFSDB} & database per una cella AFS.\\
473 \const{T\_X25} & indirizzo di chiamata per X.25.\\
474 \const{T\_ISDN} & indirizzo di chiamata per ISDN.\\
475 \const{T\_RT} & router.\\
476 \const{T\_NSAP} & indirizzo NSAP.\\
477 \const{T\_NSAP\_PTR}& risoluzione inversa per NSAP (deprecato).\\
478 \const{T\_SIG} & firma digitale di sicurezza.\\
479 \const{T\_KEY} & chiave per firma.\\
480 \const{T\_PX} & corrispondenza per la posta X.400.\\
481 \const{T\_GPOS} & posizione grografica.\\
482 \const{T\_AAAA} & indirizzo IPv6.\\
483 \const{T\_LOC} & informazione di collocazione.\\
484 \const{T\_NXT} & dominio successivo.\\
485 \const{T\_EID} & identificatore di punto conclusivo.\\
486 \const{T\_NIMLOC}& posizionatore \textit{nimrod}.\\
487 \const{T\_SRV} & servizio.\\
488 \const{T\_ATMA} & indirizzo ATM.\\
489 \const{T\_NAPTR} & puntatore ad una \textit{naming authority} .\\
490 \const{T\_TSIG} & firma di transazione.\\
491 \const{T\_IXFR} & trasferimento di zona incrementale.\\
492 \const{T\_AXFR} & trasferimenzo di zona di autorità.\\
493 \const{T\_MAILB} & trasferimento di record di caselle di posta.\\
494 \const{T\_MAILA} & trasferimetno di record di server di posta.\\
495 \const{T\_ANY} & valore generico.\\
498 \caption{Costanti identificative del tipo di record per l'argomento
499 \param{type} di \func{res\_query}.}
500 \label{tab:DNS_record_type}
504 L'elenco di tab.~\ref{tab:DNS_record_type} è quello di \textsl{tutti} i
505 \textit{resource record} definiti, con una breve descrizione del relativo
506 significato. Di tutti questi però viene impiegato correntemente solo un
507 piccolo sottoinsieme, alcuni sono obsoleti ed altri fanno riferimento a dati
508 applicativi che non ci interessano, pertanto non entreremo nei dettagli del
509 significato di tutti quanti, ma solo di quelli usati dalle funzioni del
510 \textit{resolver}, che sono sostanzialmente i seguenti:
511 \begin{basedescript}{\desclabelwidth{1.2cm}\desclabelstyle{\nextlinelabel}}
512 \item[\texttt{A}] per indicare la corripondenza fra un nome a dominio ed un
513 indirizzo IPv4, ad esempio la corrispondenza fra \texttt{dodds.truelite.it}
514 e l'indirizzo IP \texttt{62.48.34.25}.
515 \item[\texttt{AAAA}] per indicare la corrispondenza fra un nome a dominio ed
516 un indirizzo IPv6; è chiamato in questo modo dato che la dimensione di un
517 indirizzo IPv6 è quattro volte quella di un indirizzo IPv4.
518 \item[\texttt{PTR}] per provvedere la mappatura inversa fra un indirizzo IP ed
519 un nome a dominio si utilizza questo tipo di record (il cui nome sta per
521 \item[\texttt{CNAME}] qualora si abbiamo più nomi che corrispondono allo
522 stesso indirizzo (come ad esempio \texttt{www.truelite.it}, o
523 \texttt{sources.truelite.it}, che fanno sempre riferimento a
524 \texttt{dodds.truelite.it}) si può usare questo tipo di record per creare
525 degli \textit{alias} in modo da associare un qualunque altro nome al
526 \textsl{nome canonico} della macchina (quello associato al record
530 Come accennato in caso di successo le due funzioni di richiesta restituiscono
531 il risultato della interrogazione al server, in caso di insuccesso l'errore
532 invece viene segnalato da un valore di ritorno pari a -1, ma in questo caso, a
533 differenza delle funzioni viste finora, non può essere utilizzata la variabile
534 \var{errno} per riportare un codice di errore, in quanto questo viene
535 impostato per ciascuna delle chiamate al sistema utilizzate, e può non avere
536 nessun significato nell'indicare quale parte del procedimento di risoluzione è
539 Per questo motivo all'interno del resolver è stata definita una apposita
540 variabile di errore, \var{h\_errno} che viene utilizzata dalle funzioni del
541 resolver per indicare quale problema ha causato il fallimento della
542 risoluzione del nome. Ad essa si può accedere una volta che la si dichiara
544 \includecodesnip{listati/herrno.c}
545 ed i valori che può assumere sono riportati in tab.~\ref{tab:h_errno_values}.
551 \begin{tabular}[c]{|l|p{10cm}|}
553 \textbf{Costante} & \textbf{Significato} \\
556 \const{HOST\_NOT\_FOUND} & l'indirizzo richiesto non è valido e la
557 macchina indicata è sconosciuta. \\
558 \const{NO\_ADDRESS} & il nome a dominio richiesto è valido, ma non ha
559 un indirizzo associato ad esso
560 (alternativamente può essere indicato come
561 \const{NO\_DATA}). \\
562 \const{NO\_RECOVERY} & si è avuto un errore non recuperabile
563 nell'interrogazione di un server DNS. \\
564 \const{TRY\_AGAIN} & si è avuto un errore temporaneo
565 nell'interrogazione di un server DNS, si può
566 ritentare l'interrogazione in un secondo
570 \caption{Valori possibili della variabile \var{h\_errno}.}
571 \label{tab:h_errno_values}
575 Insieme alla nuova variabile vengono definite anche due nuove funzioni per
576 stampare l'errore a video, analoghe a quelle di sez.~\ref{sec:sys_strerror},
577 ma che usano il valore di \var{h\_errno}; la prima è \funcd{herror} ed il suo
581 \funcdecl{void herror(const char *string)}
583 Stampa un errore di risoluzione.
586 La funzione è l'analoga di \func{perror} e stampa sullo standard error un
587 messaggio di errore corrispondente al valore corrente di \var{h\_errno}, a cui
588 viene anteposta la stringa \param{string} passata come argomento. La seconda
589 funzione è \funcd{hstrerror} ed il suo prototipo è:
592 \funcdecl{const char *hstrerror(int err)}
594 Restituisce una stringa corripondente ad un errore di risoluzione.
596 \noindent e come per l'analoga \func{strerror} restituise una stringa con un
597 messaggio di errore già formattato corrispondente al codice passato come
598 argomento (che si presume sia dato da \var{h\_errno}).
603 \subsection{La risoluzione dei nomi a dominio}
604 \label{sec:sock_gethostbyname}
606 La principale funzionalità del \textit{resolver} resta quella di risolvere i
607 nomi a dominio in indirizzi IP, per cui non ci dedicheremo oltre alle funzioni
608 di richiesta generica ed esamineremo invece le funzioni a questo dedicate. La
609 prima funzione è \funcd{gethostbyname} il cui scopo è ottenere l'indirizzo di
610 una stazione noto il suo nome a dominio, il suo prototipo è:
611 \begin{prototype}{netdb.h}
612 {struct hostent *gethostbyname(const char *name)}
614 Determina l'indirizzo associato al nome a dominio \param{name}.
616 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
617 struttura di tipo \struct{hostent} contente i dati associati al nome a
618 dominio o un puntatore nullo in caso di errore.}
621 La funzione prende come argomento una stringa \param{name} contenente il nome
622 a dominio che si vuole risolvere, in caso di successo i dati ad esso relativi
623 vengono memorizzati in una opportuna struttura \struct{hostent} la cui
624 definizione è riportata in fig.~\ref{fig:sock_hostent_struct}.
627 \footnotesize \centering
628 \begin{minipage}[c]{15cm}
629 \includestruct{listati/hostent.h}
631 \caption{La struttura \structd{hostent}.}
632 \label{fig:sock_hostent_struct}
635 Quando un programma chiama \func{gethostbyname} e questa usa il DNS per
636 effettuare la risoluzione del nome, è con i valori contenuti nei relativi
637 record che vengono riempite le varie parti della struttura \struct{hostent}.
638 Il primo campo della struttura, \var{h\_name} contiene sempre il \textsl{nome
639 canonico}, che nel caso del DNS è appunto il nome associato ad un record
640 \texttt{A}. Il secondo campo della struttura, \var{h\_aliases}, invece è un
641 puntatore ad vettore di puntatori, terminato da un puntatore nullo. Ciascun
642 puntatore del vettore punta ad una stringa contenente uno degli altri
643 possibili nomi associati allo stesso \textsl{nome canonico} (quelli che nel
644 DNS vengono inseriti come record di tipo \texttt{CNAME}).
646 Il terzo campo della struttura, \var{h\_addrtype}, indica il tipo di indirizzo
647 che è stato restituito, e può assumere soltanto i valori \const{AF\_INET} o
648 \const{AF\_INET6}, mentre il quarto campo, \var{h\_length}, indica la
649 lunghezza dell'indirizzo stesso in byte.
651 Infine il campo \var{h\_addr\_list} è il puntatore ad un vettore di puntatori
652 ai singoli indirizzi; il vettore è terminato da un puntatore nullo. Inoltre,
653 come illustrato in fig.~\ref{fig:sock_hostent_struct}, viene definito il campo
654 \var{h\_addr} come sinonimo di \code{h\_addr\_list[0]}, cioè un riferimento
655 diretto al primo indirizzo della lista.
657 Oltre ai normali nomi a dominio la funzione accetta come argomento
658 \param{name} anche indirizzi numerici, in formato dotted decimal per IPv4 o
659 con la notazione illustrata in sez.~\ref{sec:IP_ipv6_notation}. In tal caso
660 \func{gethostbyname} non eseguirà nessuna interrogazione remota, ma si
661 limiterà a copiare la stringa nel campo \var{h\_name} ed a creare la
662 corrispondente struttura \var{in\_addr} da indirizzara con
663 \code{h\_addr\_list[0]}.
667 \footnotesize \centering
668 \begin{minipage}[c]{15cm}
669 \includecodesample{listati/myhost.c}
672 \caption{Esempio di codice per la risoluzione di un indirizzo.}
673 \label{fig:myhost_example}
676 Vediamo allora un primo esempio dell'uso di queste funzioni, in
677 fig.~\ref{fig:myhost_example} è riportato un estratto del codice di un
678 programma che esegue una semplice interrogazione al resolver usando
679 \func{gethostbyname} e stampa a video i risultati. Al solito il sorgente
680 completo, he comprende il trattamento delle opzioni ed una funzione per
681 stampare un messaggio di aiuto, è nel file \texttt{myhost.c} dei sorgenti
686 Con l'uso di \func{gethostbyname} normalmente si ottengono solo gli indirizzi
687 IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
688 l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e chiamare
689 \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per modificare
690 le opzioni del resolver; dato che questo non è molto comodo è stata definita
691 un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
692 \begin{prototype}{netdb.h}
693 {struct hostent *gethostbyname2(const char *name, int af)}
695 Determina l'indirizzo di tipo \param{af} associato al nome a dominio
698 \bodydesc{La funzione restituisce in caso di successo il puntatore ad una
699 struttura di tipo \struct{hostent} contente i dati associati al nome a
700 dominio o un puntatore nullo in caso di errore.}
704 In questo caso la funzione prende un secondo argomento \param{af} che indica
705 la famiglia di indirizzi da usare come
709 \section{Le opzioni dei socket}
710 \label{sec:TCP_sock_options}
712 Finora abbiamo trattato i socket nel loro comportamento più comune, è però
713 possibile attivare alcune modalità diverse di funzionamento degli stessi
715 Dato che la maggior parte delle opzioni dei socket sono relative ai socket
716 TCP, ed hanno poi significato analogo quando usate con altri socket, abbiamo
717 preferito trattare l'argomento in generale in questa sezione piuttosto che nel
718 capitolo dedicato alla trattazione generica dei socket.
720 \section{Altre funzioni di controllo}
721 \label{sec:TCP_sock_ctrl}
729 %%% TeX-master: "gapil"