+\subsection{Le funzioni per il riordinamento}
+\label{sec:sock_func_ord}
+
+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)}
+ Converte l'intero a 32 bit \param{hostlong} dal formato della macchina a
+ quello della rete.
+
+ \funcdecl{unsigned short int htons(unsigned short int hostshort)}
+ Converte l'intero a 16 bit \param{hostshort} dal formato della macchina a
+ quello della rete.
+
+ \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 ntohs(unsigned short int netshort)}
+ Converte l'intero a 16 bit \param{netshort} dal formato della rete a quello
+ della macchina.
+
+ \bodydesc{Tutte le funzioni restituiscono il valore convertito, e non
+ prevedono errori.}
+\end{functions}
+
+I nomi sono assegnati usando la lettera \texttt{n} come mnemonico per indicare
+l'ordinamento usato sulla rete (da \textit{network order}) e la lettera
+\texttt{h} come mnemonico per l'ordinamento usato sulla macchina locale (da
+\textit{host order}), mentre le lettere \texttt{s} e \texttt{l} stanno ad
+indicare i tipi di dato (\ctyp{long} o \ctyp{short}, riportati anche dai
+prototipi).
+
+Usando queste funzioni si ha la conversione automatica: nel caso in cui la
+macchina che si sta usando abbia una architettura \textit{big endian} queste
+funzioni sono definite come macro che non fanno nulla. Per questo motivo vanno
+sempre utilizzate, anche quando potrebbero non essere necessarie, in modo da
+assicurare la portabilità del codice su tutte le architetture.
+
+
+\subsection{Le funzioni \func{inet\_aton}, \func{inet\_addr} e
+ \func{inet\_ntoa}}
+\label{sec:sock_func_ipv4}
+
+Un secondo insieme di funzioni di manipolazione serve per passare dal formato
+binario usato nelle strutture degli indirizzi alla rappresentazione simbolica
+dei numeri IP che si usa normalmente.
+
+Le prime tre funzioni di manipolazione riguardano la conversione degli
+indirizzi IPv4 da una stringa in cui il numero di IP è espresso secondo la
+cosiddetta notazione \textit{dotted-decimal}, (cioè nella forma
+\texttt{192.168.0.1}) al formato binario (direttamente in \textit{network
+ order}) e viceversa; in questo caso si usa la lettera \texttt{a} come
+mnemonico per indicare la stringa. Dette funzioni sono \funcd{inet\_addr},
+\funcd{inet\_aton} e \funcd{inet\_ntoa}, ed i rispettivi prototipi sono:
+\begin{functions}
+ \headdecl{arpa/inet.h}
+
+ \funcdecl{in\_addr\_t inet\_addr(const char *strptr)} Converte la stringa
+ dell'indirizzo \textit{dotted decimal} in nel numero IP in network order.
+
+ \funcdecl{int inet\_aton(const char *src, struct in\_addr *dest)} Converte
+ la stringa dell'indirizzo \textit{dotted decimal} in un indirizzo IP.
+
+ \funcdecl{char *inet\_ntoa(struct in\_addr addrptr)}
+ Converte un indirizzo IP in una stringa \textit{dotted decimal}.
+
+ \bodydesc{Tutte queste le funzioni non generano codice di errore.}
+\end{functions}
+
+La prima funzione, \func{inet\_addr}, restituisce l'indirizzo a 32 bit in
+network order (del tipo \type{in\_addr\_t}) a partire dalla stringa passata
+nell'argomento \param{strptr}. In caso di errore (quando la stringa non esprime
+un indirizzo valido) restituisce invece il valore \const{INADDR\_NONE} che
+tipicamente sono trentadue bit a uno. Questo però comporta che la stringa
+\texttt{255.255.255.255}, che pure è un indirizzo valido, non può essere usata
+con questa funzione; per questo motivo essa è generalmente deprecata in favore
+di \func{inet\_aton}.
+
+La funzione \func{inet\_aton} converte la stringa puntata da \param{src}
+nell'indirizzo binario che viene memorizzato nell'opportuna struttura
+\struct{in\_addr} (si veda fig.~\ref{fig:sock_sa_ipv4_struct}) situata
+all'indirizzo dato dall'argomento \param{dest} (è espressa in questa forma in
+modo da poterla usare direttamente con il puntatore usato per passare la
+struttura degli indirizzi). La funzione restituisce 0 in caso di successo e 1
+in caso di fallimento. Se usata con \param{dest} inizializzato a \val{NULL}
+effettua la validazione dell'indirizzo.
+
+L'ultima funzione, \func{inet\_ntoa}, converte il valore a 32 bit
+dell'indirizzo (espresso in \textit{network order}) restituendo il puntatore
+alla stringa che contiene l'espressione in formato dotted decimal. Si deve
+tenere presente che la stringa risiede in memoria statica, per cui questa
+funzione non è rientrante.
+
+
+\subsection{Le funzioni \func{inet\_pton} e \func{inet\_ntop}}
+\label{sec:sock_conv_func_gen}
+
+Le tre funzioni precedenti sono limitate solo ad indirizzi IPv4, per questo
+motivo è preferibile usare le due nuove funzioni \func{inet\_pton} e
+\func{inet\_ntop} che possono convertire anche gli indirizzi IPv6. Anche in
+questo caso le lettere \texttt{n} e \texttt{p} sono degli mnemonici per
+ricordare il tipo di conversione effettuata e stanno per \textit{presentation}
+e \textit{numeric}.
+
+% \begin{figure}[htb]
+% \centering
+
+% \caption{Schema della rappresentazioni utilizzate dalle funzioni di
+% conversione \texttt{inet\_pton} e \texttt{inet\_ntop} }
+% \label{fig:sock_inet_conv_func}
+
+% \end{figure}
+
+Entrambe le funzioni accettano l'argomento \param{af} che indica il tipo di
+indirizzo, e che può essere soltanto \const{AF\_INET} o \const{AF\_INET6}. La
+prima funzione, \funcd{inet\_pton}, serve a convertire una stringa in un
+indirizzo; il suo prototipo è:
+\begin{prototype}{sys/socket.h}
+{int inet\_pton(int af, const char *src, void *addr\_ptr)}
+
+ Converte l'indirizzo espresso tramite una stringa nel valore numerico.
+
+ \bodydesc{La funzione restituisce un valore negativo se \param{af} specifica
+ una famiglia di indirizzi non valida, con \var{errno} che assume il valore
+ \errcode{EAFNOSUPPORT}, un valore nullo se \param{src} non rappresenta un
+ indirizzo valido, ed un valore positivo in caso di successo.}
+\end{prototype}
+
+La funzione converte la stringa indicata tramite \param{src} nel valore
+numerico dell'indirizzo IP del tipo specificato da \param{af} che viene
+memorizzato all'indirizzo puntato da \param{addr\_ptr}, la funzione
+restituisce un valore positivo in caso di successo, nullo se la stringa non
+rappresenta un indirizzo valido, e negativo se \param{af} specifica una
+famiglia di indirizzi non valida.
+
+La seconda funzione di conversione è \funcd{inet\_ntop} che converte un
+indirizzo in una stringa; il suo prototipo è:
+\begin{prototype}{sys/socket.h}
+ {char *inet\_ntop(int af, const void *addr\_ptr, char *dest, size\_t len)}
+ Converte l'indirizzo dalla relativa struttura in una stringa simbolica.
+
+ \bodydesc{La funzione restituisce un puntatore non nullo alla stringa
+ convertita in caso di successo e \val{NULL} in caso di fallimento, nel
+ qual caso \var{errno} assume i valori:
+ \begin{errlist}
+ \item[\errcode{ENOSPC}] le dimensioni della stringa con la conversione
+ dell'indirizzo eccedono la lunghezza specificata da \param{len}.
+ \item[\errcode{ENOAFSUPPORT}] la famiglia di indirizzi \param{af} non è
+ una valida.
+ \end{errlist}}
+\end{prototype}
+
+La funzione converte la struttura dell'indirizzo puntata da \param{addr\_ptr}
+in una stringa che viene copiata nel buffer puntato dall'indirizzo
+\param{dest}; questo deve essere preallocato dall'utente e la lunghezza deve
+essere almeno \const{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e
+\const{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
+comunque venire specificata attraverso il parametro \param{len}.