\label{sec:sock_options}
Benché dal punto di vista del loro uso come canali di trasmissione di dati i
-socket siano trattati allo stesso modo dei file, associandoli a dei file
-descriptor, e utilizzando le varie funzioni di I/O su di questi, la normale
-interfaccia usata per la gestione dei file non è ovviamente sufficiente a
-poterne controllare tutte le caratteristiche, che variano tra l'altro a
-seconda del loro tipo. In questa sezione vedremo allora quali sono le funzioni
-dedicate alla gestione di tutte le caratteristiche specifiche dei vari tipi di
-socket, le cosiddette \textit{socket options}.
+socket siano trattati allo stesso modo dei file, ed acceduti tramite i file
+descriptor, la normale interfaccia usata per la gestione dei file non è
+sufficiente a poterne controllare tutte le caratteristiche, che variano tra
+l'altro a seconda del loro tipo (e della relativa forma di comunicazione
+sottostante). In questa sezione vedremo allora quali sono le funzioni dedicate
+alla gestione delle caratteristiche specifiche dei vari tipi di socket, le
+cosiddette \textit{socket options}.
\subsection{Le funzioni \func{setsockopt} e \func{getsockopt}}
\label{sec:sock_setsockopt}
+Le varie caratteristiche dei socket possono essere gestite attraverso l'uso di
+due funzioni generiche che permettono rispettivamente di impostarle e di
+recuperarne il valore corrente. La prima di queste due funzioni, quella usata
+per impostare le \textit{socket options}, è \funcd{setsockopt}, ed il suo
+prototipo è:
+\begin{functions}
+ \headdecl{sys/socket.h}
+ \headdecl{sys/types.h}
+
+ \funcdecl{int setsockopt(int sock, int level, int optname, const void
+ *optval, socklen\_t optlen)}
+ Imposta le opzioni di un socket.
+
+ \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+ errore, nel qual caso \var{errno} assumerà i valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido.
+ \item[\errcode{EFAULT}] l'indirizzo \param{optval} non è valido.
+ \item[\errcode{EINVAL}] il valore di \param{optlen} non è valido.
+ \item[\errcode{ENOPROTOOPT}] l'opzione scelta non esiste per il livello
+ indicato.
+ \item[\errcode{ENOTSOCK}] il file descriptor \param{sock} non corrisponde ad
+ un socket.
+ \end{errlist}
+}
+\end{functions}
+Il primo argomento della funzione, \param{sock}, indica il socket su cui si
+intende operare; per indicare l'opzione da impostare si devono usare i due
+argomenti successivi, \param{level} e \param{optname}. Come abbiamo visto in
+sez.~\ref{sec:net_protocols} i protocolli di rete sono strutturati su vari
+livelli, ed l'interfaccia dei socket può usarne più di uno. Si avranno allora
+diverse funzionalità e caratteristiche per ciascun protocollo usato da un
+socket, e quindi saranno anche diverse le opzioni che di potranno impostare, a
+seconda del \textsl{livello} (trasporto, rete, ecc.) su cui si va ad operare.
+
+Il valore di \param{level} seleziona allora il protocollo su cui vuole
+intervenire, e permette di usare per \param{optname} i valori delle opzioni
+che sono definite su quel protocollo. Esiste però anche il valore speciale
+\const{SOL\_SOCKET} che indica un livello di base e cioè le opzioni
+disponibili per qualunque tipo di socket. Per impostare le opzioni relative
+alle funzionalità dei singoli protocolli si deve utilizzare il valore numerico
+che identifica questi ultimi in \file{/etc/protocols}; più comunemente si
+usano le apposite costanti \texttt{SOL\_*} riportate in
+tab.~\ref{tab:sock_option_levels}, dove si sono riassunti i valori possibili
+per l'argomento \param{level}.\footnote{la notazione in questo caso è,
+ purtroppo, abbastanza confusa: infatti in Linux il valore si può impostare
+ sia usando le costanti \texttt{SOL\_*}, che le analoghe \texttt{IPPROTO\_*}
+ (citate anche da Stevens in \cite{UNP1}); entrambe hanno gli stessi valori
+ che sono equivalenti ai numeri di protocollo di \file{/etc/protocols}, con
+ una eccesione specifica, che è quella del protocollo ICMP, per la quale non
+ esista una costante, il che è comprensibile dato che il suo valore, 1, è
+ quello che viene assegnato a \const{SOL\_SOCKET}.}
-Le due funzioni principali per gestire le caratteristiche specifiche dei vari
-tipi di socket sono \func{setsockopt} e \func{getsockopt}.
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|l|}
+ \hline
+ \textbf{Livello} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{SOL\_SOCKET}& opzioni generiche dei socket.\\
+ \const{SOL\_IP} & opzioni specifiche per i socket che usano IPv4.\\
+ \const{SOL\_TCP} & opzioni per i socket che usano TCP.\\
+ \const{SOL\_IPV6} & opzioni specifiche per i socket che usano IPv6.\\
+ \const{SOL\_ICMPV6}& opzioni specifiche per i socket che usano ICMPv6.\\
+ \hline
+ \end{tabular}
+ \caption{Possibili valori dell'argomento \param{level} delle
+ funzioni \func{setsockopt} e \func{getsockopt}.}
+ \label{tab:sock_option_levels}
+\end{table}
+
+Il quarto argomento, \param{optval} è un puntatore ad una zona di memoria che
+contiene i dati che specificano il valore dell'opzione che si vuole passare al
+socket (e il tipo di dati varia a seconda dell'opzione), mentre l'ultimo
+argomento \param{optlen},\footnote{questo argomento è in realtà sempre di tipo
+ \ctyp{int}, come era nelle \acr{libc4} e \acr{libc5}; l'uso di
+ \ctyp{socklen\_t} è stato introdotto da POSIX (valgono le stesse
+ considerazioni per l'uso di questo tipo di dato fatte in
+ sez.~\ref{sec:TCP_func_accept}) ed adottato dalle \acr{glibc}.} è la
+dimensione in byte dei dati presenti all'indirizzo indicato da \param{optval}.
+
+La gran parte delle opzioni utilizzano per \param{optval} un valore intero, se
+poi l'opzione esprime una condizione logica si deve usare particolare un
+valore non nullo per abilitarla ed un valore nullo per disabilitarla. Se
+invece l'opzione non prevede di dover ricevere nessun tipo di valore si deve
+impostare \param{optval} a \const{NULL}.
+
+La seconda funzione usata per controllare le proprietà dei socket è
+\func{getsockopt}, che serve a leggere i valori delle opzioni dd a farsi
+restituire i dati relativi al loro funzionamento; il suo prototipo è:
+\begin{functions}
+ \headdecl{sys/socket.h}
+ \headdecl{sys/types.h}
+
+ \funcdecl{int getsockopt(int s, int level, int optname, void *optval,
+ socklen\_t *optlen)} Legge le opzioni di un socket.
+
+ \bodydesc{La funzione restituisce 0 in caso di successo e -1 in caso di
+ errore, nel qual caso \var{errno} assumerà i valori:
+ \begin{errlist}
+ \item[\errcode{EBADF}] il file descriptor \param{sock} non è valido.
+ \item[\errcode{EFAULT}] l'indirizzo \param{optval} o quello di
+ \param{optlen} non è valido.
+ \item[\errcode{ENOPROTOOPT}] l'opzione scelta non esiste per il livello
+ indicato.
+ \item[\errcode{ENOTSOCK}] il file descriptor \param{sock} non corrisponde ad
+ un socket.
+ \end{errlist}
+}
+\end{functions}
+
+I primi tre argomenti sono identici ed hanno lo stesso significato di quelli
+di \func{setsockopt}, mentre \param{optval} in questo caso indica l'indirizzo
+a cui andranno scritti i dati letti dal socket, e \param{optlen} è usata come
+\textit{value result argument} per indicare la lunghezza del buffer allocato
+per \param{optval} e per ricevere indietro la dimensione effettiva dei dati
+scritti su di esso.
\subsection{Le opzioni generiche}
\label{sec:sock_generic_options}
Anche se ciascun tipo di socket presenta una serie di caratteristiche
-particolari, gestite attraverso delle opzioni specifiche, ma esiste un insieme
-generico di opzioni che possono applicarsi a qualunque tipo di socket.
+particolari, gestite attraverso delle opzioni specifiche, esiste un insieme
+generico di opzioni che possono applicarsi a qualunque tipo di
+socket.\footnote{una descrizione di queste opzioni è generalmente disponibile
+ nella quarta sezione delle pagine di manuale con \texttt{man 4 socket}.}
+Come detto in tal caso il livello da scegliere è \const{SOL\_SOCKET}
+
+
+
+In generale il valore di \param{optname} viene passato invariato al
+
+
+
+
+
\section{Altre funzioni di controllo}
specifico quando la si impiega su file descriptor associati a dei socket.
+\subsection{L'uso di \func{sysctl} per le proprietà della rete}
+\label{sec:sock_sysctl}
+
+Come ultimo argomento di questa sezione tratteremo l'uso della funzione
+\func{sysctl} (che è stata introdotta nelle sue funzionalità generiche in
+sez.~\ref{sec:sys_sysctl}) per quanto riguarda le sue capacità di effettuare
+impostazioni relative a proprietà generali dei socket (di tutti quelli di un
+certo tipo o di tutti quelli che usano un certo protocollo) rispetto alle
+funzioni viste finora che consentono di controllare quelle di un singolo
+socket.
+
+
+
%%% Local Variables:
%%% mode: latex