+Le strutture degli indirizzi vengono sempre passate alle varie funzioni
+attraverso puntatori (cioè \textit{by reference}), ma le funzioni devono poter
+maneggiare puntatori a strutture relative a tutti gli indirizzi possibili
+nelle varie famiglie di protocolli; questo pone il problema di come passare
+questi puntatori, il C ANSI risolve questo problema coi i puntatori generici
+(i \texttt{void *}), ma l'interfaccia dei socket è antecendente alla
+definizione dello standard ANSI, e per questo nel 1982 fu scelto di definire
+una struttura generica \texttt{sockaddr} per gli indirizzi dei socket mostrata
+in \nfig:
+
+\begin{figure}[!htbp]
+ \footnotesize
+ \begin{lstlisting}{}
+struct sockaddr {
+ sa_family_t sa_family; /* address family: AF_xxx */
+ char sa_data[14]; /* address (protocol-specific) */
+};
+ \end{lstlisting}
+ \caption{La struttura generica degli indirizzi dei socket \texttt{sockaddr}}
+ \label{fig:sock_sa_struct}
+\end{figure}
+
+Tutte le funzioni dei socket che usano gli indirizzi sono definite usando nel
+prototipo un puntatore a questa struttura; per questo motivo quando si
+invocano dette funzioni passando l'indirizzo di un protocollo specifico
+occorrerà eseguire un casting del relativo puntatore.
+
+I tipi di dati che compongono la struttura sono stabiliti dallo standard
+Posix.1g, riassunti in \ntab\ con i rispettivi file di include in cui sono
+definiti; la struttura è invece definita nell'include file
+\texttt{sys/socket.h}
+
+\begin{table}[!htbp]
+ \centering
+ \begin{tabular}{|l|l|l|}
+ \hline
+ \multicolumn{1}{|c|}{Tipo}& \multicolumn{1}{|c|}{Descrizione}&
+ \multicolumn{1}{|c|}{Header} \\
+ \hline
+ \hline
+ \texttt{int8\_t} & intero a 8 bit con segno & \texttt{sys/types.h}\\
+ \texttt{uint8\_t} & intero a 8 bit senza segno & \texttt{sys/types.h}\\
+ \texttt{int16\_t} & intero a 16 bit con segno & \texttt{sys/types.h}\\
+ \texttt{uint16\_t} & intero a 16 bit senza segno& \texttt{sys/types.h}\\
+ \texttt{int32\_t} & intero a 32 bit con segno & \texttt{sys/types.h}\\
+ \texttt{uint32\_t} & intero a 32 bit senza segno& \texttt{sys/types.h}\\
+ \hline
+ \texttt{sa\_family\_t} & famiglia degli indirizzi& \texttt{sys/socket.h}\\
+ \texttt{socklen\_t} & lunghezza (\texttt{uint32\_t}) dell'indirizzo di
+ un socket& \texttt{sys/socket.h}\\
+ \hline
+ \texttt{in\_addr\_t} & indirizzo IPv4 (\texttt{uint32\_t}) &
+ \texttt{netinet/in.h}\\
+ \texttt{in\_port\_t} & porta TCP o UDP (\texttt{uint16\_t})&
+ \texttt{netinet/in.h}\\
+ \hline
+ \end{tabular}
+ \caption{Tipi di dati usati nelle strutture degli indirizzi, secondo quanto
+ stabilito dallo standard Posix.1g}
+ \label{tab:sock_data_types}
+\end{table}
+
+In alcuni sistemi (per BSD a partire da 4.3BSD-reno) la struttura è
+leggermente diversa e prevede un primo membro aggiuntivo \texttt{uint8\_t
+ sin\_len} (come riportato da R. Stevens nei suoi libri). Questo campo non
+verrebbe usato direttamente dal programmatore e non è richiesto dallo standard
+Posix.1g, in Linux pertanto non sussiste. Il campo \texttt{sa\_family\_t} era
+storicamente un \texttt{unsigned short}.
+
+Dal punto di vista del programmatore l'unico uso di questa struttura è quello
+di fare da riferimento per il casting, per il kernel le cose sono un po'
+diverse, in quanto esso usa il puntatore per recuperare il campo
+\texttt{sa\_family} con cui determinare il tipo di indirizzo; per questo
+motivo, anche se l'uso di un puntatore \texttt{void *} sarebbe più immediato
+per l'utente (che non dovrebbe più eseguire il casting), è stato mantenuto
+l'uso di questa struttura.
+
+