From: Simone Piccardi Date: Wed, 8 Dec 2004 23:21:04 +0000 (+0000) Subject: Iniziate le opzioni dei socket. X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=b48836f645c2760bc040d3bf76f2436735d4b321;p=gapil.git Iniziate le opzioni dei socket. --- diff --git a/sockctrl.tex b/sockctrl.tex index a67e9b6..b1199d6 100644 --- a/sockctrl.tex +++ b/sockctrl.tex @@ -1827,23 +1827,87 @@ 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. + +La scelta su quale opzione agire è fatta appunto con l'uso dell'argomento +\param{level}, per esso esiste il valore speciale \const{SOL\_SOCKET} che +indica il livello astratto di socket (cioè di opzioni disponibili in generale +per qualunque tipo di socket), per impostare altre opzioni relative a +funzionalità disponibili per socket che usano particolari protocolli si usa in +genere il valore numerico degli stessi in \file{/etc/protocols},\footnote{o + quanto si può ottenere da una chiamata a \func{getprotoent}, questo però + presenta l'ambiguità dovuta al fatto che su Linux \const{SOL\_SOCKET} è + definito uguale ad 1, che corrisponde anche al valore di ICMP, che pertanto + non compare nelle varie costanti \texttt{SOL\_*}.} più comunemente però si +utilizzano 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}. +\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 +1946,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