Prova di endianess
[gapil.git] / socket.tex
index 06831e7ba290f3b0a4cdf460b9de4e6f2ee888c5..0d35c3ec43bea60c21f1bf3707fd05f192864f5a 100644 (file)
@@ -1,6 +1,6 @@
 %% socket.tex
 %%
-%% Copyright (C) 2000-2002 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2003 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",
@@ -13,8 +13,8 @@
 
 In questo capitolo inizieremo a spiegare le caratteristiche salienti della
 principale interfaccia per la programmazione di rete, quella dei
-\textit{socket}, che, pur essendo nata in ambiente Unix è usata ormai da tutti
-i sistemi operativi.
+\textit{socket}, che, pur essendo nata in ambiente Unix, è usata ormai da
+tutti i sistemi operativi.
 
 Dopo una breve panoramica sulle caratteristiche di questa interfaccia vedremo
 come creare un socket e come collegarlo allo specifico protocollo di rete che
@@ -732,12 +732,11 @@ cos
 \label{sec:sock_addr_func}
 
 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.
+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}\index{endianess}}
@@ -749,15 +748,24 @@ due modi, chiamati rispettivamente \textit{big endian} e \textit{little
 variabili intere (ed in genere in diretta corrispondenza a come sono poi in
 realtà cablati sui bus interni del computer).
 
-Per capire meglio il problema si consideri un intero a 16 bit scritto in una
-locazione di memoria posta ad un certo indirizzo. I singoli bit possono essere
-disposti un 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{little endian} dato che il dato finale è la parte ``piccola'' del
-numero. Il caso opposto, in cui si parte dal bit meno significativo è detto
-per lo stesso motivo \textit{big endian}.
+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
+\figref{fig:sock_endianess} i singoli bit possono essere disposti un 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}.
+
+\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}
 
 La \textit{endianess}\index{endianess} di un computer dipende essenzialmente
 dalla architettura hardware usata; Intel e Digital usano il \textit{little
@@ -779,15 +787,11 @@ questi cambiamenti.
 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, e ne sarà quindi
-invertito l'ordine di lettura per cui, per riavere il valore originale,
-dovranno essere rovesciati.
-
-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{ntonl} e \funcd{ntons} ed i
-rispettivi prototipi sono:
+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)} 
@@ -798,11 +802,11 @@ rispettivi prototipi sono:
   Converte l'intero a 16 bit \param{hostshort} dal formato della macchina a
   quello della rete.
 
-  \funcdecl{unsigned long int ntonl(unsigned long int netlong)}
+  \funcdecl{unsigned long int ntohl(unsigned long int netlong)}
   Converte l'intero a 32 bit \param{netlong} dal formato della rete a quello
   della macchina.
 
-  \funcdecl{unsigned sort int ntons(unsigned short int netshort)}
+  \funcdecl{unsigned sort int ntohs(unsigned short int netshort)}
   Converte l'intero a 16 bit \param{netshort} dal formato della rete a quello
   della macchina.