Modificato la sezione invariante mettendoci solo quello che e effettivamente
[gapil.git] / sockctrl.tex
index a67e9b6f38939e5933eae0ae7e10a11843f4e077..4b07f89b92e601cd8103f02a2ab5b7a7ec3a6d49 100644 (file)
@@ -1827,23 +1827,93 @@ quale si voglia far ascoltare il server.
 \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)}
+
+
+  \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; il secondo argomento, \param{level} indica invece il livello
+a cui si intende impostare l'opzione. Come abbiamo visto in
+sez.~\ref{sec:net_protocols} infatti i protocolli di rete sono strutturati su
+più livelli; pertanto anche le proprietà e le opzioni disponibili dipendono
+dai protocolli usati dal socket sul quale si va ad agire, e saranno anche esse
+differenziate a seconda del protocollo cui fanno riferimento. 
+
+
+
+
+Il valore di \param{level} seleziona allora il livello sul quale si va ad
+intervenire e permette di usare le opzioni definite su quel livello. Esiste
+poi il valore \const{SOL\_SOCKET} che indica un livello generico e cioè le
+opzioni disponibili per qualunque tipo di socket.  Per impostare le opzioni
+relative alle funzionalità disponibili per socket che usano particolari
+protocolli può utilizzare il valore numerico che identifica questi ultimi in
+\file{/etc/protocols}, ma più comunemente si suano le apposite costanti
+\texttt{SOL\_*} riportate in tab.~\ref{tab:sock_option_levels} dove si sono
+riassunti i possibili valori 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 delle
+  analoghe \texttt{IPPROTO\_*} (citate anche da Stevens in \cite{UNP1}) che di
+  nuovo 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, dato poi che il suo valore, 1, è anche quello che viene
+  assegnato a \const{SOL\_SOCKET}.}
 
+\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}
 
-Le due funzioni principali per gestire le caratteristiche specifiche dei vari
-tipi di socket sono \func{setsockopt} e \func{getsockopt}.
 
 
 \subsection{Le opzioni generiche}
@@ -1882,6 +1952,19 @@ nell'ambito dell'applicazione su file normali; tratteremo qui il suo uso
 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