Reindicizzate alcune macro, messa sezione sulle opzioni di IP, risistemata
[gapil.git] / socket.tex
index 9d86a3ef0d7732645ef58403581e50f49670c1ed..833d037482cf352b6e255ae71b13ad60fa32ca9d 100644 (file)
@@ -1,9 +1,9 @@
 %% socket.tex
 %%
 %% socket.tex
 %%
-%% Copyright (C) 2000-2004 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2005 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
 %% 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",
+%% Free Software Foundation; with the Invariant Sections being "Un preambolo",
 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
 %% with no Front-Cover Texts, and with no Back-Cover Texts.  A copy of the
 %% license is included in the section entitled "GNU Free Documentation
 %% License".
@@ -240,7 +240,7 @@ Si tenga presente che non tutte le famiglie di protocolli sono utilizzabili
 dall'utente generico, ad esempio in generale tutti i socket di tipo
 \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi
 di amministratore (cioè con user-ID effettivo uguale a zero) o dotati della
 dall'utente generico, ad esempio in generale tutti i socket di tipo
 \const{SOCK\_RAW} possono essere creati solo da processi che hanno i privilegi
 di amministratore (cioè con user-ID effettivo uguale a zero) o dotati della
-capability \texttt{CAP\_NET\_RAW}.
+capability \const{CAP\_NET\_RAW}.
 
 
 \subsection{Il tipo, o stile}
 
 
 \subsection{Il tipo, o stile}
@@ -255,7 +255,7 @@ disposizione vari tipi di socket (che corrispondono a quelli che il manuale
 della \acr{glibc} \cite{glibc} chiama \textit{styles}) identificati dalle
 seguenti costanti:
 
 della \acr{glibc} \cite{glibc} chiama \textit{styles}) identificati dalle
 seguenti costanti:
 
-\begin{basedescript}{\desclabelwidth{2.8cm}\desclabelstyle{\nextlinelabel}}
+\begin{basedescript}{\desclabelwidth{2.9cm}\desclabelstyle{\nextlinelabel}}
 \item[\const{SOCK\_STREAM}] Provvede un canale di trasmissione dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
 \item[\const{SOCK\_STREAM}] Provvede un canale di trasmissione dati
   bidirezionale, sequenziale e affidabile. Opera su una connessione con un
   altro socket. I dati vengono ricevuti e trasmessi come un flusso continuo di
@@ -457,7 +457,7 @@ altrimenti si avr
 specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono
 chiamati \textsl{riservati} in quanto utilizzati da servizi standard e
 soltanto processi con i privilegi di amministratore (con user-ID effettivo
 specifica il \textsl{numero di porta}. I numeri di porta sotto il 1024 sono
 chiamati \textsl{riservati} in quanto utilizzati da servizi standard e
 soltanto processi con i privilegi di amministratore (con user-ID effettivo
-uguale a zero) o con la capability \texttt{CAP\_NET\_BIND\_SERVICE} possono
+uguale a zero) o con la capability \const{CAP\_NET\_BIND\_SERVICE} possono
 usare la funzione \func{bind} (che vedremo in sez.~\ref{sec:TCP_func_bind}) su
 queste porte.
 
 usare la funzione \func{bind} (che vedremo in sez.~\ref{sec:TCP_func_bind}) su
 queste porte.
 
@@ -541,8 +541,9 @@ il campo \var{sun\_path} deve specificare un indirizzo. Questo ha due forme;
 può essere un file (di tipo socket) nel filesystem o una stringa univoca
 (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
 specificato come una stringa (terminata da uno zero) corrispondente al
 può essere un file (di tipo socket) nel filesystem o una stringa univoca
 (mantenuta in uno spazio di nomi astratto). Nel primo caso l'indirizzo viene
 specificato come una stringa (terminata da uno zero) corrispondente al
-pathname del file; nel secondo invece \var{sun\_path} inizia con uno zero e
-vengono usati come nome i restanti byte come stringa, senza terminazione.
+\index{\textit{pathname}}\textit{pathname} del file; nel secondo invece
+\var{sun\_path} inizia con uno zero e vengono usati come nome i restanti byte
+come stringa, senza terminazione.
 
 
 \subsection{La struttura degli indirizzi AppleTalk}
 
 
 \subsection{La struttura degli indirizzi AppleTalk}
@@ -718,13 +719,13 @@ cos
 % passaggio dipende dalla direzione del medesimo, dal processo al kernel o
 % viceversa.
 
 % passaggio dipende dalla direzione del medesimo, dal processo al kernel o
 % viceversa.
 
-% In particolare le tre funzioni \texttt{bind}, \texttt{connect} e
-% \texttt{sendto} passano la struttura al kernel, in questo caso è passata
+% In particolare le tre funzioni \func{bind}, \func{connect} e
+% \func{sendto} passano la struttura al kernel, in questo caso è passata
 % \textsl{per valore} anche la dimensione della medesima
 
 
 % \textsl{per valore} anche la dimensione della medesima
 
 
-% Le funzioni \texttt{accept}, \texttt{recvfrom}, \texttt{getsockname} e
-% \texttt{getpeername} invece ricevono i valori del kernel 
+% Le funzioni \func{accept}, \func{recvfrom}, \func{getsockname} e
+% \func{getpeername} invece ricevono i valori del kernel 
 
 
 
 
 
 
@@ -739,15 +740,24 @@ ci
 seguito.
 
 
 seguito.
 
 
-\subsection{La \textit{endianess}\index{endianess}}
+\subsection{La \textit{endianess}}
 \label{sec:sock_endianess}
 
 \label{sec:sock_endianess}
 
+\index{\textit{endianess}|(}
 La rappresentazione di un numero binario in un computer può essere fatta in
 due modi, chiamati rispettivamente \textit{big endian} e \textit{little
   endian} a seconda di come i singoli bit vengono aggregati per formare le
 variabili intere (ed in genere in diretta corrispondenza a come sono poi in
 realtà cablati sui bus interni del computer).
 
 La rappresentazione di un numero binario in un computer può essere fatta in
 due modi, chiamati rispettivamente \textit{big endian} e \textit{little
   endian} a seconda di come i singoli bit vengono aggregati per formare le
 variabili intere (ed in genere in diretta corrispondenza a come sono poi in
 realtà cablati sui bus interni del computer).
 
+\begin{figure}[htb]
+  \centering
+  \includegraphics[height=3cm]{img/endianess}
+  \caption{Schema della disposizione dei dati in memoria a seconda della
+    \textit{endianess}.}
+  \label{fig:sock_endianess}
+\end{figure}
+
 Per capire meglio il problema si consideri un intero a 32 bit scritto in una
 locazione di memoria posta ad un certo indirizzo. Come illustrato in
 fig.~\ref{fig:sock_endianess} i singoli bit possono essere disposti un memoria
 Per capire meglio il problema si consideri un intero a 32 bit scritto in una
 locazione di memoria posta ad un certo indirizzo. Come illustrato in
 fig.~\ref{fig:sock_endianess} i singoli bit possono essere disposti un memoria
@@ -759,19 +769,11 @@ dato che si trova per prima la parte pi
 parte dal bit meno significativo è detto per lo stesso motivo \textit{little
   endian}.
 
 parte dal bit meno significativo è detto per lo stesso motivo \textit{little
   endian}.
 
-\begin{figure}[htb]
-  \centering
-  \includegraphics[height=3cm]{img/endianess}
-  \caption{Schema della disposizione dei dati in memoria a seconda della
-    \textit{endianess}\index{endianess}.}
-  \label{fig:sock_endianess}
-\end{figure}
-
-Si può allora verificare quale tipo di endianess usa il proprio computer con
-un programma elementare che si limita ad assegnare un valore ad una variabile
-per poi ristamparne il contenuto leggendolo un byte alla volta. Il codice di
-detto programma, \file{endtest.c}, è nei sorgenti allegati, allora se lo
-eseguiamo su un PC otterremo:
+Si può allora verificare quale tipo di \textit{endianess} usa il proprio
+computer con un programma elementare che si limita ad assegnare un valore ad
+una variabile per poi ristamparne il contenuto leggendolo un byte alla volta.
+Il codice di detto programma, \file{endtest.c}, è nei sorgenti allegati,
+allora se lo eseguiamo su un PC otterremo:
 \begin{verbatim}
 [piccardi@gont sources]$ ./endtest
 Using value ABCDEF01
 \begin{verbatim}
 [piccardi@gont sources]$ ./endtest
 Using value ABCDEF01
@@ -791,13 +793,13 @@ val[3]= 1
 \end{verbatim}%$
 
 
 \end{verbatim}%$
 
 
-La \textit{endianess}\index{endianess} di un computer dipende essenzialmente
-dalla architettura hardware usata; Intel e Digital usano il \textit{little
-  endian}, Motorola, IBM, Sun (sostanzialmente tutti gli altri) usano il
-\textit{big endian}. Il formato dei dati contenuti nelle intestazioni dei
-protocolli di rete è anch'esso \textit{big endian}; altri esempi di uso di
-questi due diversi formati sono quello del bus PCI, che è \textit{little
-  endian}, o quello del bus VME che è \textit{big endian}.
+La \textit{endianess} di un computer dipende essenzialmente dalla architettura
+hardware usata; Intel e Digital usano il \textit{little endian}, Motorola,
+IBM, Sun (sostanzialmente tutti gli altri) usano il \textit{big endian}. Il
+formato dei dati contenuti nelle intestazioni dei protocolli di rete è
+anch'esso \textit{big endian}; altri esempi di uso di questi due diversi
+formati sono quello del bus PCI, che è \textit{little endian}, o quello del
+bus VME che è \textit{big endian}.
 
 Esistono poi anche dei processori che possono scegliere il tipo di formato
 all'avvio e alcuni che, come il PowerPC o l'Intel i860, possono pure passare
 
 Esistono poi anche dei processori che possono scegliere il tipo di formato
 all'avvio e alcuni che, come il PowerPC o l'Intel i860, possono pure passare
@@ -806,12 +808,6 @@ in Linux l'ordinamento 
 resta sempre lo stesso, anche quando il processore permetterebbe di eseguire
 questi cambiamenti.
 
 resta sempre lo stesso, anche quando il processore permetterebbe di eseguire
 questi cambiamenti.
 
-Per controllare quale tipo di ordinamento si ha sul proprio computer si è
-scritta una piccola funzione di controllo, il cui codice è riportato
-fig.~\ref{fig:sock_endian_code}, che restituisce un valore nullo (falso) se
-l'architettura è \textit{big endian} ed uno non nullo (vero) se l'architettura
-è \textit{little endian}.
-
 \begin{figure}[htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
 \begin{figure}[htb]
   \footnotesize \centering
   \begin{minipage}[c]{15cm}
@@ -823,6 +819,12 @@ l'architettura 
   \label{fig:sock_endian_code}
 \end{figure}
 
   \label{fig:sock_endian_code}
 \end{figure}
 
+Per controllare quale tipo di ordinamento si ha sul proprio computer si è
+scritta una piccola funzione di controllo, il cui codice è riportato
+fig.~\ref{fig:sock_endian_code}, che restituisce un valore nullo (falso) se
+l'architettura è \textit{big endian} ed uno non nullo (vero) se l'architettura
+è \textit{little endian}.
+
 Come si vede la funzione è molto semplice, e si limita, una volta assegnato
 (\texttt{\small 9}) un valore di test pari a \texttt{0xABCD} ad una variabile
 di tipo \ctyp{short} (cioè a 16 bit), a ricostruirne una copia byte a byte.
 Come si vede la funzione è molto semplice, e si limita, una volta assegnato
 (\texttt{\small 9}) un valore di test pari a \texttt{0xABCD} ad una variabile
 di tipo \ctyp{short} (cioè a 16 bit), a ricostruirne una copia byte a byte.
@@ -833,20 +835,22 @@ significativo (cio
 \textit{little endian}). Infine la funzione restituisce (\texttt{\small 12})
 il valore del confonto delle due variabili. 
 
 \textit{little endian}). Infine la funzione restituisce (\texttt{\small 12})
 il valore del confonto delle due variabili. 
 
+\index{\textit{endianess}|)}
 
 
 
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
 
 
 
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
-Il problema connesso all'endianess\index{endianess} è che quando si passano
-dei dati da un tipo di architettura all'altra i dati vengono interpretati in
-maniera diversa, e ad esempio nel caso dell'intero a 16 bit ci si ritroverà
-con i due byte in cui è suddiviso scambiati di posto.  Per questo motivo si
-usano delle funzioni di conversione che servono a tener conto automaticamente
-della possibile differenza fra l'ordinamento usato sul computer e quello che
-viene usato nelle trasmissione sulla rete; queste funzioni sono \funcd{htonl},
-\funcd{htons}, \funcd{ntohl} e \funcd{ntohs} ed i rispettivi prototipi sono:
+Il problema connesso all'endianess\index{\textit{endianess}} è che quando si
+passano dei dati da un tipo di architettura all'altra i dati vengono
+interpretati in maniera diversa, e ad esempio nel caso dell'intero a 16 bit ci
+si ritroverà con i due byte in cui è suddiviso scambiati di posto.  Per questo
+motivo si usano delle funzioni di conversione che servono a tener conto
+automaticamente della possibile differenza fra l'ordinamento usato sul
+computer e quello che viene usato nelle trasmissione sulla rete; queste
+funzioni sono \funcd{htonl}, \funcd{htons}, \funcd{ntohl} e \funcd{ntohs} ed i
+rispettivi prototipi sono:
 \begin{functions}
   \headdecl{netinet/in.h}
   \funcdecl{unsigned long int htonl(unsigned long int hostlong)} 
 \begin{functions}
   \headdecl{netinet/in.h}
   \funcdecl{unsigned long int htonl(unsigned long int hostlong)} 
@@ -952,7 +956,7 @@ e \textit{numeric}.
 %   \centering  
 
 %   \caption{Schema della rappresentazioni utilizzate dalle funzioni di 
 %   \centering  
 
 %   \caption{Schema della rappresentazioni utilizzate dalle funzioni di 
-%     conversione \texttt{inet\_pton} e \texttt{inet\_ntop} }
+%     conversione \func{inet\_pton} e \func{inet\_ntop} }
 %   \label{fig:sock_inet_conv_func}
 
 % \end{figure}
 %   \label{fig:sock_inet_conv_func}
 
 % \end{figure}