From dd095412c46c4439e91efa378926f48248561ca7 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Tue, 16 Oct 2007 17:40:22 +0000 Subject: [PATCH] Correzioni di impaginazione e indicizzazione --- listati/mygethost.c | 4 ++ sockctrl.tex | 132 +++++++++++++++++++++++--------------------- 2 files changed, 72 insertions(+), 64 deletions(-) diff --git a/listati/mygethost.c b/listati/mygethost.c index 0378058..6587e6b 100644 --- a/listati/mygethost.c +++ b/listati/mygethost.c @@ -9,10 +9,14 @@ int main(int argc, char *argv[]) char *addr; char buffer[INET6_ADDRSTRLEN]; ... + /* + * Main Body + */ if ((argc - optind) != 1) { printf("Wrong number of arguments %d\n", argc - optind); usage(); } + /* get resolution */ data = gethostbyname(argv[1]); if (data == NULL) { herror("Errore di risoluzione"); diff --git a/sockctrl.tex b/sockctrl.tex index 529d0d3..dc300a8 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -735,41 +735,41 @@ trattamento delle opzioni ed una funzione per stampare un messaggio di aiuto, è nel file \texttt{mygethost.c} dei sorgenti allegati alla guida. Il programma richiede un solo argomento che specifichi il nome da cercare, -senza il quale (\texttt{\small 12--15}) esce con un errore. Dopo di che -(\texttt{\small 16}) si limita a chiamare \func{gethostbyname}, ricevendo il -risultato nel puntatore \var{data}. Questo (\texttt{\small 17--20}) viene +senza il quale (\texttt{\small 15--18}) esce con un errore. Dopo di che +(\texttt{\small 20}) si limita a chiamare \func{gethostbyname}, ricevendo il +risultato nel puntatore \var{data}. Questo (\texttt{\small 21--24}) viene controllato per rilevare eventuali errori, nel qual caso il programma esce dopo aver stampato un messaggio con \func{herror}. -Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 21}) -con lo stampare il nome canonico, dopo di che (\texttt{\small 22--26}) si -stampano eventuali altri nomi. Per questo prima (\texttt{\small 22}) si prende +Se invece la risoluzione è andata a buon fine si inizia (\texttt{\small 25}) +con lo stampare il nome canonico, dopo di che (\texttt{\small 26--30}) si +stampano eventuali altri nomi. Per questo prima (\texttt{\small 26}) si prende il puntatore alla cima della lista che contiene i nomi e poi (\texttt{\small - 23--26}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si + 27--30}) si esegue un ciclo che sarà ripetuto fin tanto che nella lista si troveranno dei puntatori validi\footnote{si ricordi che la lista viene terminata da un puntatore nullo.} per le stringhe dei nomi; prima -(\texttt{\small 24}) si stamperà la stringa e poi (\texttt{\small 25}) si +(\texttt{\small 28}) si stamperà la stringa e poi (\texttt{\small 29}) si provvederà ad incrementare il puntatore per passare al successivo elemento della lista. Una volta stampati i nomi si passerà a stampare gli indirizzi, il primo passo -(\texttt{\small 27--34}) è allora quello di riconoscere il tipo di indirizzo +(\texttt{\small 31--38}) è allora quello di riconoscere il tipo di indirizzo sulla base del valore del campo \var{h\_addrtype}, stampandolo a video. Si è anche previsto di stampare un errore nel caso (che non dovrebbe mai accadere) di un indirizzo non valido. -Infine (\texttt{\small 35--40}) si stamperanno i valori degli indirizzi, di -nuovo (\texttt{\small 35}) si inizializzerà un puntatore alla cima della lista +Infine (\texttt{\small 39--44}) si stamperanno i valori degli indirizzi, di +nuovo (\texttt{\small 39}) si inizializzerà un puntatore alla cima della lista e si eseguirà un ciclo fintanto che questo punterà ad indirizzi validi in maniera analoga a quanto fatto in precedenza per i nomi a dominio. Si noti come, essendo il campo \var{h\_addr\_list} un puntatore ad strutture di indirizzi generiche, questo sia ancora di tipo \texttt{char **} e si possa riutilizzare lo stesso puntatore usato per i nomi. -Per ciascun indirizzo valido si provvederà (\texttt{\small 37}) ad una +Per ciascun indirizzo valido si provvederà (\texttt{\small 41}) ad una conversione con la funzione \func{inet\_ntop} (vedi sez.~\ref{sec:sock_addr_func}) passandole gli opportuni argomenti, questa -restituirà la stringa da stampare (\texttt{\small 38}) con il valore +restituirà la stringa da stampare (\texttt{\small 42}) con il valore dell'indirizzo in \var{buffer}, che si è avuto la cura di dichiarare inizialmente (\texttt{\small 10}) con dimensioni adeguate; dato che la funzione è in grado di tenere conto automaticamente del tipo di indirizzo non @@ -962,7 +962,7 @@ tab.~\ref{tab:sock_getipnodebyname_flags}. \begin{table}[!htb] \centering \footnotesize - \begin{tabular}[c]{|l|p{10cm}|} + \begin{tabular}[c]{|l|p{8cm}|} \hline \textbf{Costante} & \textbf{Significato} \\ \hline @@ -1011,14 +1011,15 @@ funzione \funcd{freehostent}, il cui prototipo La funzione permette di disallocare una struttura \var{hostent} precedentemente allocata in una chiamata di \func{getipnodebyname} o \func{getipnodebyaddr}, e prende come argomento l'indirizzo restituito da una -di queste funzioni. +di queste funzioni. Infine per concludere la nostra panoramica sulle funzioni di risoluzione dei nomi dobbiamo citare le funzioni che permettono di interrogare gli altri servizi di risoluzione dei nomi illustrati in sez.~\ref{sec:sock_resolver}; in generale infatti ci sono una serie di funzioni nella forma -\texttt{getXXXbyname} e \texttt{getXXXbyaddr} per ciascuna delle informazioni -di rete mantenute dal \textit{Name Service Switch} che permettono +\texttt{getXXXbyname} e \texttt{getXXXbyaddr} (dove \texttt{XXX} indica il +servizio) per ciascuna delle informazioni di rete mantenute dal +\itindex{Name~Service~Switch} \textit{Name Service Switch} che permettono rispettivamente di trovare una corrispondenza cercando per nome o per numero. L'elenco di queste funzioni è riportato nelle colonne finali di @@ -1026,10 +1027,10 @@ tab.~\ref{tab:name_resolution_functions}, dove le si sono suddivise rispetto al tipo di informazione che forniscono (riportato in prima colonna). Nella tabella si è anche riportato il file su cui vengono ordinariamente mantenute queste informazioni, che però può essere sostituito da un qualunque supporto -interno al \textit{Name Service Switch} (anche se usualmente questo avviene -solo per la risoluzione degli indirizzi). Ciascuna funzione fa riferimento ad -una sua apposita struttura che contiene i relativi dati, riportata in terza -colonna. +interno al \itindex{Name~Service~Switch} \textit{Name Service Switch} (anche +se usualmente questo avviene solo per la risoluzione degli indirizzi). +Ciascuna funzione fa riferimento ad una sua apposita struttura che contiene i +relativi dati, riportata in terza colonna. \begin{table}[!htb] \centering @@ -1051,22 +1052,23 @@ colonna. \hline \end{tabular} \caption{Funzioni di risoluzione dei nomi per i vari servizi del - \textit{Name Service Switch}.} + \itindex{Name~Service~Switch} \textit{Name Service Switch}.} \label{tab:name_resolution_functions} \end{table} Delle funzioni di tab.~\ref{tab:name_resolution_functions} abbiamo trattato finora soltanto quelle relative alla risoluzione dei nomi, dato che sono le più usate, e prevedono praticamente da sempre la necessità di rivolgersi ad -una entità esterna; per le altre invece, estensioni fornite dal NSS a parte, -si fa sempre riferimento ai dati mantenuti nei rispettivi file. +una entità esterna; per le altre invece, estensioni fornite dal +\itindex{Name~Service~Switch} NSS a parte, si fa sempre riferimento ai dati +mantenuti nei rispettivi file. Dopo la risoluzione dei nomi a dominio una delle ricerche più comuni è quella -sui nomi dei servizi noti (cioè \texttt{http}, \texttt{smtp}, ecc.) da -associare alle rispettive porte, le due funzioni da utilizzare per questo sono -\funcd{getservbyname} e \funcd{getservbyaddr}, che permettono rispettivamente -di ottenere il numero di porta associato ad un servizio dato il nome e -viceversa; i loro prototipi sono: +sui nomi dei servizi di rete più comuni (cioè \texttt{http}, \texttt{smtp}, +ecc.) da associare alle rispettive porte. Le due funzioni da utilizzare per +questo sono \funcd{getservbyname} e \funcd{getservbyaddr}, che permettono +rispettivamente di ottenere il numero di porta associato ad un servizio dato +il nome e viceversa; i loro prototipi sono: \begin{functions} \headdecl{netdb.h} \funcdecl{struct servent *getservbyname(const char *name, const char *proto)} @@ -1093,14 +1095,15 @@ qualsiasi. Il primo argomento è il nome del servizio per \func{getservbyname}, specificato tramite la stringa \param{name}, mentre \func{getservbyport} richiede il numero di porta in \param{port}. Entrambe le funzioni eseguono una -ricerca sul file \conffile{/etc/services}\footnote{il \textit{Name Service - Switch} astrae il concetto a qualunque supporto su cui si possano - mantenere i suddetti dati. } ed estraggono i dati dalla prima riga che -corrisponde agli argomenti specificati; se la risoluzione ha successo viene -restituito un puntatore ad una apposita struttura \struct{servent} contenente -tutti i risultati), altrimenti viene restituito un puntatore nullo. Si tenga -presente che anche in questo caso i dati vengono mantenuti in una area di -memoria statica e che quindi la funzione non è rientrante. +ricerca sul file \conffile{/etc/services}\footnote{il + \itindex{Name~Service~Switch} \textit{Name Service Switch} astrae il + concetto a qualunque supporto su cui si possano mantenere i suddetti dati.} +ed estraggono i dati dalla prima riga che corrisponde agli argomenti +specificati; se la risoluzione ha successo viene restituito un puntatore ad +una apposita struttura \struct{servent} contenente tutti i risultati, +altrimenti viene restituito un puntatore nullo. Si tenga presente che anche +in questo caso i dati vengono mantenuti in una area di memoria statica e che +quindi la funzione non è rientrante. \begin{figure}[!htb] \footnotesize \centering @@ -1122,18 +1125,18 @@ contiene il numero di porta e \var{s\_proto} il nome del protocollo. Come riportato in tab.~\ref{tab:name_resolution_functions} ci sono analoghe funzioni per la risoluzione del nome dei protocolli e delle reti; non staremo a descriverle nei dettagli, in quanto il loro uso è molto limitato, esse -comunque hanno una struttura del tutto analoga alle precedenti, e tutti i -dettagli relativi al loro funzionamento possono essere trovati nelle -rispettive pagine di manuale. +comunque utilizzano una loro struttura dedicata del tutto analoga alle +precedenti: tutti i dettagli relativi al loro funzionamento possono essere +trovati nelle rispettive pagine di manuale. Oltre alle funzioni di ricerca esistono delle ulteriori funzioni che prevedono -una lettura sequenziale delle informazioni mantenute nel \textit{Name Service - Switch} (in sostanza permettono di leggere i file contenenti le informazioni -riga per riga), che sono analoghe a quelle elencate in -tab.~\ref{tab:sys_passwd_func} per le informazioni relative ai dati degli -utenti e dei gruppi. Nel caso specifico dei servizi avremo allora le tre -funzioni \funcd{setservent}, \funcd{getservent} e \funcd{endservent} i cui -prototipi sono: +una lettura sequenziale delle informazioni mantenute nel +\itindex{Name~Service~Switch} \textit{Name Service Switch} (in sostanza +permettono di leggere i file contenenti le informazioni riga per riga), che +sono analoghe a quelle elencate in tab.~\ref{tab:sys_passwd_func} per le +informazioni relative ai dati degli utenti e dei gruppi. Nel caso specifico +dei servizi avremo allora le tre funzioni \funcd{setservent}, +\funcd{getservent} e \funcd{endservent} i cui prototipi sono: \begin{functions} \headdecl{netdb.h} \funcdecl{void setservent(int stayopen)} @@ -1189,8 +1192,8 @@ rimandando alle rispettive pagine di manuale. protocollo&\func{setprotoent}&\func{getprotoent}&\func{endprotoent}\\ \hline \end{tabular} - \caption{Funzioni lettura sequenziale dei dati del \textit{Name Service - Switch}.} + \caption{Funzioni lettura sequenziale dei dati del + \itindex{Name~Service~Switch} \textit{Name Service Switch}.} \label{tab:name_sequential_read} \end{table} @@ -1330,14 +1333,6 @@ rispettivo protocollo di trasporto (i cui valori possibili sono riportati in relativi a UDP e TCP, o il valore nullo che indica di ignorare questo campo nella selezione. -Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una -maschera binaria; i bit di questa variabile infatti vengono usati per dare -delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a -quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname}; -il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle -costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un -bit della maschera. - \begin{table}[!htb] \centering \footnotesize @@ -1384,6 +1379,15 @@ bit della maschera. \label{tab:ai_flags_values} \end{table} + +Infine l'ultimo campo è \var{ai\_flags}; che deve essere impostato come una +maschera binaria; i bit di questa variabile infatti vengono usati per dare +delle indicazioni sul tipo di risoluzione voluta, ed hanno valori analoghi a +quelli visti in sez.~\ref{sec:sock_name_services} per \func{getipnodebyname}; +il valore di \var{ai\_flags} può essere impostata con un OR aritmetico delle +costanti di tab.~\ref{tab:ai_flags_values}, ciascuna delle quali identifica un +bit della maschera. + La funzione restituisce un valore nullo in caso di successo, o un codice in caso di errore. I valori usati come codice di errore sono riportati in tab.~\ref{tab:addrinfo_error_code}; dato che la funzione utilizza altre @@ -3328,7 +3332,7 @@ quantit \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} - \includecodesnip{listati/is_closing.c} + \includecodesample{listati/is_closing.c} \end{minipage} \caption{Codice della funzione \texttt{is\_closing.c}, che controlla lo stato di un socket TCP per verificare se si sta chiudendo.} @@ -4421,8 +4425,8 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: nell'\href{http://www.ietf.org/rfc/rfc1122.txt}{RFC~1122} dove è indicato un massimo di 100 secondi, che però è un valore considerato troppo basso. -\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] indica allo stack TCP - del kernel di abilitare il comportamento richiesto +\item[\procrelfile{/proc/sys/net/ipv4}{tcp\_rfc1337}] indica al kernel di + abilitare il comportamento richiesto nell'\href{http://www.ietf.org/rfc/rfc1337.txt}{RFC~1337}. Prende un valore logico e di default è disabilitato, il che significa che alla ricezione di un segmento RST in stato \texttt{TIME\_WAIT} il socket viene chiuso @@ -4434,7 +4438,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: anche in rapporto alla memoria disponibile. Prende una tripletta di valori interi separati da spazi che indicano delle dimensioni in byte: - \begin{itemize*} + \begin{itemize} \item il primo valore, chiamato \textit{min} nelle pagine di manuale, indica la dimensione minima in byte del buffer di ricezione; il default è 4Kb, ma in sistemi con poca memoria viene automaticamente ridotto a @@ -4465,7 +4469,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: \procfile{/proc/sys/net/core/rmem\_max}. Questo valore non viene ad incidere sulla dimensione del buffer di ricezione di un singolo socket dichiarata con l'opzione \const{SO\_RCVBUF}. - \end{itemize*} + \end{itemize} \item[\procrelfile{/proc/sys/net/ipv4}{tcp\_sack}] indica al kernel di utilizzare il meccanismo del \textit{TCP selective acknowledgement} definito @@ -4545,7 +4549,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: adeguandole in rapporto alla memoria disponibile. Prende una tripletta di valori interi separati da spazi che indicano delle dimensioni in byte: - \begin{itemize*} + \begin{itemize} \item il primo valore, chiamato \textit{min}, indica la dimensione minima in byte del buffer di spedizione; il default è 4Kb. Come per l'analogo di \procrelfile{/proc/sys/net/ipv4}{tcp\_rmem}) viene usato per assicurare @@ -4574,7 +4578,7 @@ pagina di manuale (accessibile con \texttt{man 7 tcp}), sono i seguenti: posto con \procfile{/proc/sys/net/core/wmem\_max}. Questo valore non viene ad incidere sulla dimensione del buffer di trasmissione di un singolo socket dichiarata con l'opzione \const{SO\_SNDBUF}. - \end{itemize*} + \end{itemize} \end{basedescript} -- 2.30.2