Quasi finito con le capabilities, aggiunti pezzi su prctl, spostata la
[gapil.git] / socket.tex
index c026305177997400578027d4ed268c795c1de2f5..b8538ab3be3e1074126877f5e0e6c2c12cbe4640 100644 (file)
@@ -488,10 +488,11 @@ tab.~\ref{tab:TCP_ipv4_addr}, che rincontreremo più avanti.
 
 Infine occorre sottolineare che sia gli indirizzi che i numeri di porta devono
 essere specificati in quello che viene chiamato \textit{network order}, cioè
-con i bit ordinati in formato \textit{big endian}, questo comporta la
-necessità di usare apposite funzioni di conversione per mantenere la
-portabilità del codice (vedi sez.~\ref{sec:sock_addr_func} per i dettagli del
-problema e le relative soluzioni).
+con i bit ordinati in formato \textit{big endian} (vedi
+sez.~\ref{sec:sock_endianess}), questo comporta la necessità di usare apposite
+funzioni di conversione per mantenere la portabilità del codice (vedi
+sez.~\ref{sec:sock_addr_func} per i dettagli del problema e le relative
+soluzioni).
 
 
 \subsection{La struttura degli indirizzi IPv6}
@@ -742,120 +743,23 @@ lunghezza effettiva del pacchetto così come arrivato sulla linea.
 
 In questa sezione tratteremo delle varie funzioni usate per manipolare gli
 indirizzi, limitandoci però agli indirizzi internet.  Come accennato gli
-indirizzi e i numeri di porta usati nella rete devono essere forniti in
-formato opportuno (il \textit{network order}). Per capire cosa significa tutto
-ciò occorre introdurre un concetto generale che tornerà utile anche in
-seguito.
-
-
-\subsection{La \textit{endianess}}
-\label{sec:sock_endianess}
-
-\itindbeg{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).
-
-\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 in memoria
-in due modi: a partire dal più significativo o a partire dal meno
-significativo.  Così nel primo caso si troverà il byte che contiene i bit più
-significativi all'indirizzo menzionato e il byte con i bit meno significativi
-nell'indirizzo successivo; questo ordinamento è detto \textit{big endian},
-dato che si trova per prima la parte più grande. Il caso opposto, in cui si
-parte dal bit meno significativo è detto per lo stesso motivo \textit{little
-  endian}.
-
-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
-val[0]= 1
-val[1]=EF
-val[2]=CD
-val[3]=AB
-\end{verbatim}%$
-mentre su di un Mac avremo:
-\begin{verbatim}
-piccardi@anarres:~/gapil/sources$ ./endtest
-Using value ABCDEF01
-val[0]=AB
-val[1]=CD
-val[2]=EF
-val[3]= 1
-\end{verbatim}%$
-
-
-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
-da un tipo di ordinamento all'altro con una specifica istruzione. In ogni caso
-in Linux l'ordinamento è definito dall'architettura e dopo l'avvio del sistema
-resta sempre lo stesso, anche quando il processore permetterebbe di eseguire
-questi cambiamenti.
-
-\begin{figure}[htb]
-  \footnotesize \centering
-  \begin{minipage}[c]{15cm}
-    \includecodesample{listati/endian.c}
-  \end{minipage} 
-  \normalsize
-  \caption{La funzione \func{endian}, usata per controllare il tipo di
-    architettura della macchina.}
-  \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.
-Per questo prima (\texttt{\small 10}) si definisce il puntatore \var{ptr} per
-accedere al contenuto della prima variabile, ed infine calcola (\texttt{\small
-  11}) il valore della seconda assumendo che il primo byte sia quello meno
-significativo (cioè, per quanto visto in fig.~\ref{fig:sock_endianess}, che sia
-\textit{little endian}). Infine la funzione restituisce (\texttt{\small 12})
-il valore del confronto delle due variabili. 
-\itindend{endianess}
-
+indirizzi e i numeri di porta usati nella rete devono essere forniti nel
+cosiddetto \textit{network order}, che corrisponde al formato \textit{big
+  endian}, anche quando la proprio macchina non usa questo formati, cosa che
+può comportare la necessità di eseguire delle conversioni.
 
 
 \subsection{Le funzioni per il riordinamento}
 \label{sec:sock_func_ord}
 
-Il problema connesso \itindex{endianess} all'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},
+Come già visto in sez.~\ref{sec:sock_endianess} il problema connesso
+\itindex{endianess} all'\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}