%% sockctrl.tex
%%
-%% Copyright (C) 2004-2006 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2007 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
%% license is included in the section entitled "GNU Free Documentation
%% License".
%%
+
\chapter{La gestione dei socket}
\label{cha:sock_generic_management}
\subsection{La risoluzione dei nomi a dominio}
\label{sec:sock_name_services}
-La principale funzionalità del \itindex{resolver}\textit{resolver} resta
+La principale funzionalità del \itindex{resolver} \textit{resolver} resta
quella di risolvere i nomi a dominio in indirizzi IP, per cui non ci
dedicheremo oltre alle funzioni di richiesta generica ed esamineremo invece le
funzioni a questo dedicate. La prima funzione è \funcd{gethostbyname} il cui
IPv4, se si vogliono ottenere degli indirizzi IPv6 occorrerà prima impostare
l'opzione \const{RES\_USE\_INET6} nel campo \texttt{\_res.options} e poi
chiamare \func{res\_init} (vedi sez.~\ref{sec:sock_resolver_functions}) per
-modificare le opzioni del \itindex{resolver}\textit{resolver}; dato che
+modificare le opzioni del \itindex{resolver} \textit{resolver}; dato che
questo non è molto comodo è stata definita\footnote{questa è una estensione
fornita dalle \acr{glibc}, disponibile anche in altri sistemi unix-like.}
un'altra funzione, \funcd{gethostbyname2}, il cui prototipo è:
Vediamo allora un primo esempio dell'uso delle funzioni di risoluzione, in
fig.~\ref{fig:mygethost_example} è riportato un estratto del codice di un
programma che esegue una semplice interrogazione al
-\itindex{resolver}\textit{resolver} usando \func{gethostbyname} e poi ne
+\itindex{resolver} \textit{resolver} usando \func{gethostbyname} e poi ne
stampa a video i risultati. Al solito il sorgente completo, che comprende il
trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto,
è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida.
copiare il contenuto della sola struttura non è sufficiente per salvare tutti
i dati, in quanto questa contiene puntatori ad altri dati, che pure possono
essere sovrascritti; per questo motivo, se si vuole salvare il risultato di
-una chiamata, occorrerà eseguire quella che si chiama una
-\itindex{deep~copy}\textit{deep copy}.\footnote{si chiama così quella tecnica
- per cui, quando si deve copiare il contenuto di una struttura complessa (con
- puntatori che puntano ad altri dati, che a loro volta possono essere
- puntatori ad altri dati) si deve copiare non solo il contenuto della
- struttura, ma eseguire una scansione per risolvere anche tutti i puntatori
- contenuti in essa (e così via se vi sono altre sottostrutture con altri
- puntatori) e copiare anche i dati da questi referenziati.}
+una chiamata, occorrerà eseguire quella che si chiama una \itindex{deep~copy}
+\textit{deep copy}.\footnote{si chiama così quella tecnica per cui, quando si
+ deve copiare il contenuto di una struttura complessa (con puntatori che
+ puntano ad altri dati, che a loro volta possono essere puntatori ad altri
+ dati) si deve copiare non solo il contenuto della struttura, ma eseguire una
+ scansione per risolvere anche tutti i puntatori contenuti in essa (e così
+ via se vi sono altre sottostrutture con altri puntatori) e copiare anche i
+ dati da questi referenziati.}
Per ovviare a questi problemi nelle \acr{glibc} sono definite anche delle
versioni rientranti delle precedenti funzioni, al solito queste sono
\param{buf} e \param{buflen}.
Gli ultimi due argomenti vengono utilizzati per avere indietro i risultati
-come \itindex{value~result~argument}\textit{value result argument}, si deve
+come \itindex{value~result~argument} \textit{value result argument}, si deve
specificare l'indirizzo della variabile su cui la funzione dovrà salvare il
codice di errore con \param{h\_errnop} e quello su cui dovrà salvare il
puntatore che si userà per accedere i dati con \param{result}.
rientrante, ed alloca autonomamente tutta la memoria necessaria in cui
verranno riportati i risultati della risoluzione. La funzione scriverà
all'indirizzo puntato da \param{res} il puntatore iniziale ad una
-\itindex{linked~list}\textit{linked list} di strutture di tipo
+\itindex{linked~list} \textit{linked list} di strutture di tipo
\struct{addrinfo} contenenti tutte le informazioni ottenute.
\begin{figure}[!htb]
\begin{figure}[!htb]
\centering
\includegraphics[width=10cm]{img/addrinfo_list}
- \caption{La \itindex{linked~list}\textit{linked list} delle strutture
+ \caption{La \itindex{linked~list} \textit{linked list} delle strutture
\struct{addrinfo} restituite da \func{getaddrinfo}.}
\label{fig:sock_addrinfo_list}
\end{figure}
Come primo esempio di uso di \func{getaddrinfo} vediamo un programma
-elementare di interrogazione del \itindex{resolver}\textit{resolver} basato
+elementare di interrogazione del \itindex{resolver} \textit{resolver} basato
questa funzione, il cui corpo principale è riportato in
fig.~\ref{fig:mygetaddr_example}. Il codice completo del programma, compresa
la gestione delle opzioni in cui è gestita l'eventuale inizializzazione
\end{Verbatim}
%$
-Una volta estratti i risultati dalla \itindex{linked~list}\textit{linked list}
+Una volta estratti i risultati dalla \itindex{linked~list} \textit{linked list}
puntata da \param{res} se questa non viene più utilizzata si dovrà avere cura
di disallocare opportunamente tutta la memoria, per questo viene fornita
l'apposita funzione \funcd{freeaddrinfo}, il cui prototipo è:
Si tenga presente infine che se si copiano i risultati da una delle strutture
\struct{addrinfo} restituite nella lista indicizzata da \param{res}, occorre
-avere cura di eseguire una \itindex{deep~copy}\textit{deep copy} in cui
+avere cura di eseguire una \itindex{deep~copy} \textit{deep copy} in cui
si copiano anche tutti i dati presenti agli indirizzi contenuti nella
struttura \struct{addrinfo}, perché una volta disallocati i dati con
\func{freeaddrinfo} questi non sarebbero più disponibili.
per entrambe le funzioni. In questo caso \param{optval} viene usato per
ricevere le informazioni ed indica l'indirizzo a cui andranno scritti i dati
letti dal socket, infine \param{optlen} diventa un puntatore ad una variabile
-che viene usata come \itindex{value~result~argument}\textit{value result
+che viene usata come \itindex{value~result~argument} \textit{value result
argument} per indicare, prima della chiamata della funzione, la lunghezza
del buffer allocato per \param{optval} e per ricevere indietro, dopo la
chiamata della funzione, la dimensione effettiva dei dati scritti su di esso.
connessione si sia ristabilita e si riceva un successivo messaggio di risposta
il ciclo riparte come se niente fosse avvenuto. Infine se si riceve come
risposta un pacchetto ICMP di destinazione irraggiungibile (vedi
-sez.~\ref{sec:icmp_protocol_xxx}), verrà restituito l'errore corrispondente.
+sez.~\ref{sec:ICMP_protocol}), verrà restituito l'errore corrispondente.
In generale questa opzione serve per individuare una caduta della connessione
anche quando non si sta facendo traffico su di essa. Viene usata
Service}.
\item[\texttt{tcp\_frto}] è un valore logico che abilita il supporto per
- l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timout del
+ l'algoritmo F-RTO, un algoritmo usato per la ritrasmissione dei timeout del
protocollo TCP, che diventa molto utile per le reti wireless dove la perdita
di pacchetti è usualmente dovuta a delle interferenze radio, piuttosto che
alla congestione dei router. Di default è disabilitato.
inviati senza ricevere risposta prima che il kernel decida che la
connessione è caduta e la termini. Il valore di default è 9.
-\item[\texttt{tcp\_keepalive\_time}] il nummero di secondi che devono passare
+\item[\texttt{tcp\_keepalive\_time}] il numero di secondi che devono passare
senza traffico sulla connessione prima che il kernel, qualora si sia
utilizzata l'opzione \const{SO\_KEEPALIVE} (vedi
sez.~\ref{sec:sock_options_main}), inizi ad inviare pacchetti di pacchetti
importante (ad esempio i cluster di calcolo parallelo) in cui lo si può
abilitare.
-\item[\texttt{tcp\_max\_orphans}] il numero massimo di socjet TCP
+\item[\texttt{tcp\_max\_orphans}] il numero massimo di socket TCP
``\textsl{orfani}'' (vale a dire non associati a nessun file descriptor)
consentito nel sistema.\footnote{trattasi in genere delle connessioni
relative a socket chiusi che non hanno completato il processo di
Il secondo valore, chiamato \textit{pressure} indica il numero di pagine
allocate passato il quale lo stack TCP inizia a moderare il suo consumo di
memoria. Si esce da questo stato di \textsl{pressione} sulla memoria quando
- il numero di pagine scende sotto il precendete valore \textit{low}.
+ il numero di pagine scende sotto il precedente valore \textit{low}.
Il terzo valore, chiamato \textit{high} indica il numero massimo di pagine
che possono essere utilizzate dallo stack TCP/IP, e soprassiede ogni altro
chiusa dalla nostra parte. Il valore di default è 8 volte.
\item[\texttt{tcp\_reordering}] il numero massimo di volte che un pacchetto
- può essere riordinato nel flusso di dati, prima che lo staack TCP assuma che
+ può essere riordinato nel flusso di dati, prima che lo stack TCP assuma che
è andato perso e si ponga nello stato di \textit{slow start} (si veda
sez.~\ref{sez:tcp_protocol_xxx}) viene usata questa metrica di
riconoscimento dei riordinamenti per evitare inutili ritrasmissioni
% LocalWords: abort overflow adv win app bic convergence dsack ecn fack frto
% LocalWords: intvl probes latency orphans l'ACK SYNQ HSIZE tw buckets mem rfc
% LocalWords: orphan reordering collapse sack stdurg synack syncookies recycle
-% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione
+% LocalWords: timestamps scaling vegas avoid westwood tcpi l'incapsulazione NR
% LocalWords: metric EOPNOTSUPP mtu hwaddr ARPHRD interrupt DMA map qlen silly
% LocalWords: rename ifconf syndrome dell'ACK FTP ACCEPTFILTER advanced reno
% LocalWords: congestion control Networking cubic CUBIC highspeed HSTCP htcp
% LocalWords: HTCP hybla HYBLA scalable SCALABLE ifc req iflist access ntoa
+% LocalWords: hop Selective Acknowledgement acknowledgement Explicit RTO stack
+% LocalWords: Notification wireless denial pressure
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "gapil"
%%% End:
-% LocalWords: hop Selective Acknowledgement acknowledgement Explicit
-% LocalWords: Notification
+