X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=socket.tex;h=23d920650c241368332836c625463b012019c52d;hp=0d35c3ec43bea60c21f1bf3707fd05f192864f5a;hb=24b55de696cfd8c0d7238a6b536802aba233912d;hpb=571305d265d04aec0e35182ff17197043757e14a diff --git a/socket.tex b/socket.tex index 0d35c3e..23d9206 100644 --- a/socket.tex +++ b/socket.tex @@ -767,12 +767,37 @@ parte dal bit meno significativo \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: +\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}\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 della rete è anch'esso \textit{big endian}, -altri esempi di uso di questi formati sono quello del bus PCI, che è -\textit{little endian}, o quello del bus VME che è \textit{big endian}. +\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 @@ -781,6 +806,36 @@ in Linux l'ordinamento 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 +\figref{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} + \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} + +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 \secref{fig:sock_endianess}, che sia +\textit{little endian}). Infine la funzione restituisce (\texttt{\small 12}) +il valore del confonto delle due variabili. + + + + \subsection{Le funzioni per il riordinamento} \label{sec:sock_func_ord}