\const{SO\_KEEPALIVE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
controlla l'attività della connessione.\\
\const{SO\_OOBINLINE}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- lascia in linea i dati \textit{out-of-band}.\\
+ lascia in linea i dati \itindex{out-of-band}
+ \textit{out-of-band}.\\
\const{SO\_RCVLOWAT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
basso livello sul buffer di ricezione.\\
\const{SO\_SNDLOWAT} &$\bullet$&$\bullet$& &\texttt{int}&
forniti in sez.~\ref{sec:sock_options_main}.
\item[\const{SO\_OOBINLINE}] se questa opzione viene abilitata i dati
- \textit{out-of-band} vengono inviati direttamente nel flusso di dati del
- socket (e sono quindi letti con una normale \func{read}) invece che restare
- disponibili solo per l'accesso con l'uso del flag \const{MSG\_OOB} di
- \func{recvmsg}. L'argomento è trattato in dettaglio in
+ \itindex{out-of-band} \textit{out-of-band} vengono inviati direttamente nel
+ flusso di dati del socket (e sono quindi letti con una normale \func{read})
+ invece che restare disponibili solo per l'accesso con l'uso del flag
+ \const{MSG\_OOB} di \func{recvmsg}. L'argomento è trattato in dettaglio in
sez.~\ref{sec:TCP_urgent_data}. L'opzione funziona soltanto con socket che
- supportino i dati \textit{out-of-band} (non ha senso per socket UDP ad
- esempio), ed utilizza per \param{optval} un intero usato come valore logico.
+ supportino i dati \itindex{out-of-band} \textit{out-of-band} (non ha senso
+ per socket UDP ad esempio), ed utilizza per \param{optval} un intero usato
+ come valore logico.
\item[\const{SO\_RCVLOWAT}] questa opzione imposta il valore che indica il
numero minimo di byte che devono essere presenti nel buffer di ricezione
-
-
\subsection{Le opzioni per il protocollo IPv4}
\label{sec:sock_ipv4_options}
generiche una descrizione di esse è disponibile nella settima sezione delle
pagine di manuale, nel caso specifico la documentazione si può consultare
con \texttt{man 7 ip}.} Se si vuole operare su queste opzioni generiche il
-livello da utilizzare è \const{SOL\_IP}; si è riportato un elenco di queste
-opzioni in tab.~\ref{tab:sock_opt_iplevel}. Le costanti indicanti le opzioni e
-tutte le altre costanti ad esse collegate sono definite in
-\file{netinet/ip.h}, ed accessibili includendo detto file.
-
+livello da utilizzare è \const{SOL\_IP} (o l'equivalente \const{IPPROTO\_IP});
+si è riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_iplevel}.
+Le costanti indicanti le opzioni e tutte le altre costanti ad esse collegate
+sono definite in \file{netinet/ip.h}, ed accessibili includendo detto file.
\begin{table}[!htb]
\centering
\label{tab:sock_opt_iplevel}
\end{table}
-Le descrizioni di tab.~\ref{tab:sock_opt_iplevel} sono estremamente succinte,
-una maggiore quantità di dettagli su queste opzioni è fornito nel seguente
-elenco:
+Le descrizioni riportate in tab.~\ref{tab:sock_opt_iplevel} sono estremamente
+succinte, una maggiore quantità di dettagli sulle varie opzioni è fornita nel
+seguente elenco:
\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\subsection{Le opzioni per i protocolli TCP e UDP}
+\label{sec:sock_tcp_udp_options}
+
+In questa sezione tratteremo le varie opzioni disponibili per i socket che
+usano i due principali protocolli di comunicazione del livello di trasporto;
+UDP e TCP.\footnote{come per le precedenti, una descrizione di queste opzioni
+ è disponibile nella settima sezione delle pagine di manuale, che si può
+ consultare rispettivamente con \texttt{man 7 tcp} e \texttt{man 7 udp}; le
+ pagine di manuale però, alla stesura di questa sezione (Agosto 2006) sono
+ alquanto incomplete.} Dato che questi protocolli sono entrambi trasportati
+su IP, oltre alle opzioni generiche di sez.~\ref{sec:sock_generic_options}
+saranno comunque disponibili anche le precedenti opzioni di
+sez.~\ref{sec:sock_ipv4_options}.\footnote{in realtà in
+ sez.~\ref{sec:sock_ipv4_options} si sono riportate le opzioni per IPv4, ma
+ quelle per TCP e UDP sono le stesse anche quando si usa IPv6.}
+
+
+Il protocollo che supporta il maggior numero di opzioni è TCP; per poterle
+utilizzare occorre specificare \const{SOL\_TCP} (o l'equivalente
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si è
+riportato un elenco di queste opzioni in tab.~\ref{tab:sock_opt_tcp}. Le
+costanti indicanti le opzioni del protocollo TCP e tutte le altre costanti ad
+esse collegate sono definite in \file{netinet/tcp.h}, ed accessibili
+includendo detto file.\footnote{in realtà questo è il file usato dalle
+ librerie; la definizione delle opzioni effettivamente supportate da Linux si
+ trova nel file \texttt{linux/tcp.h}, dal quale si sono estratte le costanti
+ di tab.~\ref{tab:sock_opt_tcplevel}.}
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{TCP\_NODELAY} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_MAXSEG} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_SYNCNT} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_LINGER2} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_INFO} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni per i socket TCP disponibili al livello
+ \const{SOL\_TCP}.}
+ \label{tab:sock_opt_tcplevel}
+\end{table}
+
+Le descrizioni di tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
+sintetiche, una maggiore quantità di dettagli su queste opzioni è fornita nel
+seguente elenco:
+\begin{basedescript}{\desclabelwidth{3.0cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{TCP\_NODELAY}]
+
+\item[\const{TCP\_MAXSEG}]
+
+\item[\const{TCP\_CORK}]
+
+\item[\const{TCP\_KEEPINTVL}]
+
+\item[\const{TCP\_KEEPCNT}]
+
+\item[\const{TCP\_SYNCNT}]
+
+\item[\const{TCP\_LINGER2}]
+
+\item[\const{TCP\_DEFER\_ACCEPT}]
+
+\item[\const{TCP\_WINDOW\_CLAMP}]
+
+\item[\const{TCP\_INFO}]
+
+\item[\const{TCP\_QUICKACK}]
+
+\item[\const{TCP\_CONGESTION}] Introdotta con il kernel 2.6.13.
+
+\end{basedescript}
+
+
+Il protocollo UDP, anche per la sua maggiore semplicità, supporta un numero
+ridotto di opzioni, riportate in tab.~\ref{tab:sock_opt_udp}; anche in questo
+caso per poterle utilizzare occorrerà impostare l'opportuno valore per
+l'argomento \param{level}, che è \const{SOL\_UDP} (o l'equivalente
+\const{IPPROTO\_UDP}). Le costanti che identificano dette opzioni sono
+definite in \file{netinet/udp.h}, ed accessibili includendo detto
+file.\footnote{come per TCP, la definizione delle opzioni effettivamente
+ supportate dal kernel si trova in realtà nel file \texttt{linux/udp.h}, dal
+ quale si sono estratte le costanti di tab.~\ref{tab:sock_opt_udplevel}.}
+
+\begin{table}[!htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|c|c|c|l|l|}
+ \hline
+ \textbf{Opzione}&\texttt{get}&\texttt{set}&\textbf{flag}&\textbf{Tipo}&
+ \textbf{Descrizione}\\
+ \hline
+ \hline
+ \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %???
+ .\\
+ \hline
+ \end{tabular}
+ \caption{Le opzioni per i socket UDP disponibili al livello
+ \const{SOL\_UDP}.}
+ \label{tab:sock_opt_udplevel}
+\end{table}
+
+Ancora una volta le descrizioni contenute tab.~\ref{tab:sock_opt_udplevel}
+sono un semplice riferimento, una maggiore quantità di dettagli sulle
+caratteristiche delle opzioni citate è quello dell'elenco seguente:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+
+\item[\const{UDP\_CORK}] Introdotta con il kernel 2.5.44
+
+\item[\const{UDP\_ENCAP}] Introdotta con il kernel 2.5.67.
+
+\end{basedescript}
+
+
+
+
\section{La gestione attraverso le funzioni di controllo}
\label{sec:sock_ctrl_func}
\item[\const{SIOCSPGRP}] imposta il processo o il \itindex{process~group}
\textit{process group} a cui inviare i segnali \const{SIGIO} e
\const{SIGURG} quando viene completata una operazione di I/O asincrono o
- arrivano dei dati urgenti. Il terzo argomento deve essere un puntatore ad una
- variabile di tipo \type{pid\_t}; un valore positivo indica direttamente il
- \acr{pid} del processo, mentre un valore negativo indica (col valore
- assoluto) il \textit{process group}. Senza privilegi di amministratore o la
- capability \const{CAP\_KILL} si può impostare solo se stessi o il proprio
+ arrivano dei dati urgenti \itindex{out-of-band} (\texttt{out-of-band}). Il
+ terzo argomento deve essere un puntatore ad una variabile di tipo
+ \type{pid\_t}; un valore positivo indica direttamente il \acr{pid} del
+ processo, mentre un valore negativo indica (col valore assoluto) il
+ \textit{process group}. Senza privilegi di amministratore o la capability
+ \const{CAP\_KILL} si può impostare solo se stessi o il proprio
\textit{process group}.
\item[\const{SIOCGPGRP}] legge le impostazioni presenti sul socket
presenti nel buffer di ricezione; il socket non deve essere in stato
\texttt{LISTEN}, altrimenti si avrà un errore di \errval{EINVAL}.
\item[\const{SIOCATMARK}] ritorna un intero non nullo, da intendere come
- valore logico, se il flusso di dati è arrivato sulla posizione in cui sono
- stati ricevuti dati urgenti.
-\item[\const{SIOCOUTQ}]
+ valore logico, se il flusso di dati letti sul socket è arrivato sulla
+ posizione (detta anche \textit{urgent mark}) in cui sono stati ricevuti
+ \itindex{out-of-band} dati urgenti (vedi sez.~\ref{sec:TCP_urgent_data}).
+ Una operazione di lettura da un socket non attraversa mai questa posizione,
+ per cui è possibile controllare se la si è raggiunta o meno con questa
+ operazione.
+
+ Questo è utile quando si attiva l'opzione \const{SO\_OOBINLINE} (vedi
+ sez.~\ref{sec:sock_generic_options}) per ricevere i dati urgenti all'interno
+ del flusso dei dati ordinari del socket;\footnote{vedremo in
+ sez.~\ref{sec:TCP_urgent_data} che in genere i dati urgenti presenti su un
+ socket si leggono \textit{out-of-band} usando un opportuno flag per
+ \func{recvmsg}.} in tal caso quando \const{SIOCATMARK} restituisce un
+ valore non nullo si saprà che la successiva lettura dal socket restituirà i
+ dati urgenti e non il normale traffico; torneremo su questo in maggior
+ dettaglio in sez.~\ref{sec:TCP_urgent_data}.
+
+\item[\const{SIOCOUTQ}] restituisce la quantità di dati non ancora inviati
+ presenti nel buffer di spedizione; come per \const{SIOCINQ} il socket non
+ deve essere in stato \texttt{LISTEN}, altrimenti si avrà un errore di
+ \errval{EINVAL}.
\end{basedescript}
% LocalWords: quest'ultime neigh dev weight cong mod somaxconn Di SIOCINQ DoS
% LocalWords: Documentation SIOCATMARK SIOCOUTQ FIONREAD TIOCOUTQ Denial work
% LocalWords: netfilter scheduler mark ARP DHCP BOOTP RARP nonlocal sniffer
+% LocalWords: linux NODELAY MAXSEG CORK KEEPIDLE KEEPINTVL KEEPCNT SYNCNT INFO
+% LocalWords: DEFER ACCEPT WINDOW CLAMP QUICKACK CONGESTION ENCAP urgent