+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 nel
+cosiddetto \textit{network order}, che corrisponde al formato \textit{big
+ endian} (vedi sez.~\ref{sec:endianness}), anche quando la proprio macchina
+non usa questo formato, cosa che può comportare la necessità di eseguire delle
+conversioni.
+
+
+\subsection{Le funzioni per il riordinamento}
+\label{sec:sock_func_ord}
+
+Come già visto in sez.~\ref{sec:endianness} il problema connesso
+all'\textit{endianness} è 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{funcproto}{
+\fhead{arpa/inet.h}
+\fdecl{unsigned long int htonl(unsigned long int hostlong)}
+\fdesc{Converte l'intero a 32 bit \param{hostlong} dal formato della macchina a
+ quello della rete.}
+\fdecl{unsigned short int htons(unsigned short int hostshort)}
+\fdesc{Converte l'intero a 16 bit \param{hostshort} dal formato della macchina a
+ quello della rete.}
+\fdecl{unsigned long int ntohl(unsigned long int netlong)}
+\fdesc{Converte l'intero a 32 bit \param{netlong} dal formato della rete a
+ quello della macchina.}
+\fdecl{unsigned sort int ntohs(unsigned short int netshort)}
+\fdesc{Converte l'intero a 16 bit \param{netshort} dal formato della rete a
+ quello della macchina.}
+}
+
+{Tutte le funzioni restituiscono il valore convertito, e non prevedono
+ errori.}
+\end{funcproto}
+
+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 di conversione per gli indirizzi IPv4}
+\label{sec:sock_func_ipv4}
+
+Un secondo insieme di funzioni di manipolazione è quello che serve per passare
+dalla rappresentazione simbolica degli indirizzi IP al formato binario
+previsto dalla struttura degli indirizzi di
+fig.~\ref{fig:sock_sa_ipv4_struct}, e viceversa. La notazione più comune è la
+cosiddetta notazione \itindex{dotted-decimal} \textit{dotted-decimal}, che
+prevede che gli indirizzi IPv4 siano indicati con l'espressione del valore
+numerico decimale di ciascuno dei 4 byte che li costituiscono separati da un
+punto (ad esempio \texttt{192.168.0.1}).
+
+In realtà le funzioni che illustreremo supportano una notazione che più
+propriamente dovrebbe esser chiamata \textit{numbers-and-dot} in quanto il
+valore può essere indicato con numeri espressi sia in decimale, che in ottale
+(se indicati apponendo uno zero) che in esadecimale (se indicati apponendo
+\texttt{0x}). Inoltre per la parte meno significativa dell'espressione, quella
+che riguarda l'indirizzo locale, si può usare, eliminando altrettanti punti,
+valori a 16 o a 24 bit, e togliendo tutti i punti, si può usare anche
+direttamente un valore numerico a 32 bit.\footnote{la funzionalità si trova
+ anche in gran parte dei programmi che usano indirizzi di rete, e deriva
+ direttamente da queste funzioni.}
+
+Tradizionalmente la conversione di un indirizzo \textit{dotted-decimal} al
+valore numerico veniva eseguita dalla funzione \funcd{inet\_addr} (prevista
+fin dalle origini in BSD e inclusa in POSIX.1-2001) il cui prototipo è:
+
+\begin{funcproto}{
+\fhead{arpa/inet.h}
+\fdecl{in\_addr\_t inet\_addr(const char *strptr)}
+\fdesc{Converte la stringa dell'indirizzo \textit{dotted decimal} in nel
+ numero IP in network order.}
+}
+
+{La funzione ritorna il valore dell'indirizzo in caso di successo e
+ \const{INADDR\_NONE} per un errore e non genera codici di errore.}
+\end{funcproto}
+
+La prima funzione, \func{inet\_addr}, restituisce l'indirizzo a 32 bit in
+\textit{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 dato che genererebe comunque
+un errore; per questo motivo essa è generalmente deprecata in favore di
+\func{inet\_aton}.
+
+Per effettuare la conversione inversa la funzione usata tradizionalmente è
+\funcd{inet\_ntoa}, anch'essa presente fin da BSD 4.3, in cui si riprende la
+notazione già vista in sez.~\ref{sec:sock_func_ord} che usa la lettera
+\texttt{n} come mnemonico per indicare la rete ed \texttt{a} (per ASCII) come
+mnemonico per indicare la stringa corrispodente all'indirizzo; il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{arpa/inet.h}
+\fdecl{char *inet\_ntoa(struct in\_addr addrptr)}
+\fdesc{Converte un indirizzo IP in una stringa \textit{dotted decimal}.}
+}
+
+{La funzione l'indirizzo della stringa con il valore dell'indirizzo convertito
+ e non prevede errori.}
+\end{funcproto}
+
+La funzione converte il valore a 32 bit dell'indirizzo, espresso in
+\textit{network order}, e preso direttamente con un puntatore al relativo
+campo della struttura degli indirizzi, restituendo il puntatore alla stringa
+che contiene l'espressione in formato \textit{dotted-decimal}. Si deve tenere
+presente che la stringa risiede in un segmento di memoria statica, per cui
+viene riscritta ad ogni chiamata e la funzione non è rientrante.
+
+Per rimediare ai problemi di \funcd{inet\_addr} è stata sostituita da
+\funcd{inet\_aton}, che però non è stata standardizzata e non è presente in
+POSIX.1-2001, anche se è definita sulla gran parte dei sistemi Unix; il suo
+prototipo è:
+
+\begin{funcproto}{
+\fhead{arpa/inet.h}
+\fdecl{int inet\_aton(const char *src, struct in\_addr *dest)}
+\fdesc{Converte la stringa dell'indirizzo \textit{dotted decimal} in un
+ indirizzo IP.}
+}
+
+{La funzione ritorna un valore non nullo in caso di successo e $0$ per un
+ errore e non genera codici di errore.}
+\end{funcproto}
+
+La funzione 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 un valore diverso da zero se l'indirizzo è
+valido e la conversione ha successo e 0 in caso contrario. Se usata
+con \param{dest} inizializzato a \val{NULL} può essere usata per effettuare la
+validazione dell'indirizzo espresso da \param{src}.
+
+Oltre a queste tre funzioni esistono le ulteriori \funcm{inet\_lnaof},
+\funcm{inet\_netof} e \funcm{inet\_makeaddr} che assumono la ormai obsoleta e
+deprecata suddivisione in classi degli indirizzi IP per fornire la parte di
+rete e quella di indirizzo locale. Ad oggi il loro uso non ha più alcun senso
+per ciò non le tratteremo.
+
+
+\subsection{Le funzioni di conversione per indirizzi IP generici}
+\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}.
+
+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{funcproto}{
+\fhead{sys/socket.h}
+\fdecl{int inet\_pton(int af, const char *src, void *addr\_ptr)}
+\fdesc{Converte l'indirizzo espresso tramite una stringa nel valore numerico.}
+}
+
+{La funzione ritorna $1$ in caso di successo, $0$ se \param{src} non contiene
+ una rappresentazione valida per la famiglia di indirizzi indicati
+ da \param{af} e $-1$ se \param{af} specifica una famiglia di indirizzi non
+ valida, e solo in quest'ultimo caso \var{errno} assumerà il valore
+ \errcode{EAFNOSUPPORT}.
+}
+\end{funcproto}
+
+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 supporta
+per IPv4 la sola notazione \textit{dotted-decimal}, e non quella più completa
+\textit{number-and-dot} che abbiamo visto per \func{inet\_aton}. Per IPv6 la
+notazione prevede la suddivisione dei 128 bit dell'indirizzo in 16 parti di 16
+bit espresse con valori esadecimali separati dal carattere ``\texttt{:}'' ed
+una serie di valori nulli possono essere sostituiti (una sola volta, sempre a
+partire dalla sinistra) con la notazione ``\texttt{::}'', un esempio di
+indirizzo in questa forma potrebbe essere \texttt{2001:db8::8:ba98:2078:e3e3},
+per una descrizione più completa si veda sez.~\ref{sec:IP_ipv6_notation}.
+
+La seconda funzione di conversione è \funcd{inet\_ntop} che converte un
+indirizzo in una stringa; il suo prototipo è:
+
+\begin{funcproto}{
+\fhead{sys/socket.h}
+\fdecl{char *inet\_ntop(int af, const void *addr\_ptr, char *dest, size\_t len)}
+\fdesc{Converte l'indirizzo dalla relativa struttura in una stringa simbolica.}
+}
+
+{La funzione ritorna un puntatore non nullo alla stringa convertita in caso di
+ successo e \val{NULL} per un errore, nel qual caso \var{errno} assumerà uno
+ dei 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{funcproto}
+
+
+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 \constd{INET\_ADDRSTRLEN} in caso di indirizzi IPv4 e
+\constd{INET6\_ADDRSTRLEN} per indirizzi IPv6; la lunghezza del buffer deve
+comunque essere specificata con il parametro \param{len}.
+
+Gli indirizzi vengono convertiti da/alle rispettive strutture di indirizzo
+(una struttura \struct{in\_addr} per IPv4, e una struttura \struct{in6\_addr}
+per IPv6), che devono essere precedentemente allocate e passate attraverso il
+puntatore \param{addr\_ptr}; l'argomento \param{dest} di \func{inet\_ntop} non
+può essere nullo e deve essere allocato precedentemente.
+
+
+
+
+
+% LocalWords: socket sez cap BSD SVr XTI Transport Interface TCP stream UDP PF
+% LocalWords: datagram broadcast descriptor sys int domain type protocol errno
+% LocalWords: EPROTONOSUPPORT ENFILE kernel EMFILE EACCES EINVAL ENOBUFS raw
+% LocalWords: ENOMEM table family AF address name glibc UNSPEC LOCAL Local IPv
+% LocalWords: communication INET protocols ip AX Amateur IPX Novell APPLETALK
+% LocalWords: Appletalk ddp NETROM NetROM Multiprotocol ATMPVC Access to ATM
+% LocalWords: PVCs ITU ipv PLP DECnet Reserved for project NETBEUI LLC KEY key
+% LocalWords: SECURITY Security callback NETLINK interface device netlink Low
+% LocalWords: PACKET level packet ASH Ash ECONET Acorn Econet ATMSVC SVCs SNA
+% LocalWords: IRDA PPPOX PPPoX WANPIPE Wanpipe BLUETOOTH Bluetooth POSIX bits
+% LocalWords: dall'header tab SOCK capabilities capability styles DGRAM read
+% LocalWords: SEQPACKET RDM sockaddr reference void fig Header uint socklen at
+% LocalWords: addr netinet port len Stevens unsigned short casting nell'header
+% LocalWords: BIND SERVICE bind union order big endian flowinfo dell'header ll
+% LocalWords: multicast multicasting local socketpair sun path filesystem AARP
+% LocalWords: pathname AppleTalk netatalk personal Apple ATPROTO atalk sat if
+% LocalWords: ANYNET node ANYNODE ATADDR BCAST pcap IEEE linux ether ETH ALL
+% LocalWords: sll ifindex ethernet halen MAC hatype ARP arp pkttype HOST recv
+% LocalWords: OTHERHOST OUTGOING recvfrom recvmsg endianness little endtest Mac
+% LocalWords: Intel Digital Motorola IBM VME PowerPC l'Intel xABCD ptr htonl
+% LocalWords: htons ntohl ntohs long hostlong hostshort netlong
+% LocalWords: sort netshort host inet aton ntoa dotted decimal const char src
+% LocalWords: strptr struct dest addrptr INADDR NULL pton ntop presentation af
+% LocalWords: numeric EAFNOSUPPORT size ENOSPC ENOAFSUPPORT ADDRSTRLEN ROUTE
+% LocalWords: of tcpdump page
+
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: