\item[\const{SO\_ERROR}] questa opzione riceve un errore presente sul socket;
può essere utilizzata soltanto con \func{getsockopt} e prende per
- \param{optval} un valore intero.
+ \param{optval} un valore intero, nel quale viene restituito il codice di
+ errore, e la condizione di errore sul socket viene cancellata. Viene
+ usualmente utilizzata per ricevere il codice di errore, come accennato in
+ sez.~\ref{sec:TCP_sock_select}, quando si sta osservando il socket con una
+ \func{select} che ritorna a causa dello stesso.
\end{basedescript}
\hline
\hline
\const{IP\_OPTIONS} &$\bullet$&$\bullet$&&\texttt{void *}& %???
- Imposta o riceve le opzioni di IP.\\
+ imposta o riceve le opzioni di IP.\\
\const{IP\_PKTINFO} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio di informazione.\\
+ passa un messaggio di informazione.\\
\const{IP\_RECVTOS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio col campo TOS.\\
+ passa un messaggio col campo TOS.\\
\const{IP\_RECVTTL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio col campo TTL.\\
+ passa un messaggio col campo TTL.\\
\const{IP\_RECVOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio con le opzioni IP.\\
+ passa un messaggio con le opzioni IP.\\
\const{IP\_RETOPTS} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa un messaggio con le opzioni IP non trattate.\\
+ passa un messaggio con le opzioni IP non trattate.\\
\const{IP\_TOS} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il valore del campo TOS.\\
+ imposta il valore del campo TOS.\\
\const{IP\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il valore del campo TTL.\\
+ imposta il valore del campo TTL.\\
\const{IP\_HDRINCL} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Passa l'intestazione di IP nei dati.\\
+ passa l'intestazione di IP nei dati.\\
\const{IP\_RECVERR} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Abilita la gestione degli errori.\\
+ abilita la gestione degli errori.\\
\const{IP\_MTU\_DISCOVER} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il Path MTU Discovery.\\
+ imposta il Path MTU Discovery.\\
\const{IP\_MTU} &$\bullet$& & &\texttt{int}&
- Legge il valore attuale della MTU.\\
+ legge il valore attuale della MTU.\\
\const{IP\_ROUTER\_ALERT} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Imposta l'opzione \textit{IP router alert} sui pacchetti.\\
+ imposta l'opzione \textit{IP router alert} sui pacchetti.\\
\const{IP\_MULTICAST\_TTL} &$\bullet$&$\bullet$& &\texttt{int}&
- Imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
+ imposta il TTL per i pacchetti \itindex{multicast} \textit{multicast}.\\
\const{IP\_MULTICAST\_LOOP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
- Controlla il reinvio a se stessi dei dati di \itindex{multicast}
+ controlla il reinvio a se stessi dei dati di \itindex{multicast}
\textit{multicast}.\\
\const{IP\_ADD\_MEMBERSHIP} & &$\bullet$& &\struct{ip\_mreqn}&
- Si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
+ si unisce a un gruppo di \itindex{multicast} \textit{multicast}.\\
\const{IP\_DROP\_MEMBERSHIP}& &$\bullet$& &\struct{ip\_mreqn}&
- Si sgancia da un gruppo di \textit{multicast}.\\
+ si sgancia da un gruppo di \textit{multicast}.\\
\const{IP\_MULTICAST\_IF} & &$\bullet$& &\struct{ip\_mreqn}&
- Imposta l'interfaccia locale di un socket \itindex{multicast}
+ imposta l'interfaccia locale di un socket \itindex{multicast}
\textit{multicast}.\\
\hline
\end{tabular}
è 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.}
+ alquanto incomplete.} Dato che questi due protocolli sono entrambi
+trasportati su IP,\footnote{qui si sottintende IPv4, ma le opzioni per TCP e
+ UDP sono le stesse anche quando si usa IPv6.} 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, al
+ solito qualora si stesse utilizzando IPv6 si potrebbero utilizzare le
+ opzioni di quest'ultimo.}
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}.}
+\const{IPPROTO\_TCP}) come valore per l'argomento \param{level}. Si sono
+riportate le varie opzioni disponibili in tab.~\ref{tab:sock_opt_tcp} dove
+sono elencate le rispettive costanti da utilizzare come valore per l'argomento
+\param{optname}. Dette costanti e tutte le altre costanti e strutture
+collegate all'uso delle opzioni TCP 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|}
+ \begin{tabular}[c]{|l|c|c|c|l|p{7cm}|}
\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{}& %???
- .\\
+ \const{TCP\_NODELAY} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ spedisce tutti i pacchetti il prima possibile.\\
+ \const{TCP\_MAXSEG} &$\bullet$&$\bullet$& &\texttt{int}&
+ valore della \itindex{Maximum~Segment~Size} MSS per i pacchetti in
+ uscita.\\
+ \const{TCP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ non invia frame parziali.\\
+ \const{TCP\_KEEPIDLE} &$\bullet$&$\bullet$& &\texttt{int}&
+ tempo in secondi prima di inviare un \textit{keepalive}.\\
+ \const{TCP\_KEEPINTVL} &$\bullet$&$\bullet$& &\texttt{int}&
+ tempo in secondi prima fra \textit{keepalive} successivi.\\
+ \const{TCP\_KEEPCNT} &$\bullet$&$\bullet$& &\texttt{int}&
+ numero massimo di \textit{keepalive} inviati.\\
+ \const{TCP\_SYNCNT} &$\bullet$&$\bullet$& &\texttt{int}&
+ numero massimo di ritrasmissioni del pacchetto SYN.\\
+ \const{TCP\_LINGER2} &$\bullet$&$\bullet$& &\texttt{int}&
+ tempo di vita in stato \texttt{FIN\_WAIT2}.\\
+ \const{TCP\_DEFER\_ACCEPT}&$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ ritorna da \func{accept} solo in presenza di dati.\\
+ \const{TCP\_WINDOW\_CLAMP}&$\bullet$&$\bullet$& &\texttt{int}&
+ valore della \textit{advertised window}.\\
+ \const{TCP\_INFO} &$\bullet$&? & &\struct{tcp\_info}&
+ raccoglie informazioni sul socket.\\
+ \const{TCP\_QUICKACK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}&
+ abilita la modalità \textit{quickack}.\\
+ \const{TCP\_CONGESTION} &$\bullet$&$\bullet$&? &\texttt{?}& %???
+ non ancora documentata.\\
\hline
\end{tabular}
\caption{Le opzioni per i socket TCP disponibili al livello
\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:
+Le descrizioni riportata in tab.~\ref{tab:sock_opt_tcplevel} sono estremamente
+sintetiche, una maggiore quantità di dettagli e la spiegazione delle singole
+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\_NODELAY}] il protocollo TCP prevede, per evitare la
+ trasmissione di tanti pacchetti piccoli, che comporta un utilizzo non
+ ottimale della banda disponibile, un meccanismo di bufferizzazione dei
+ pacchetti uscenti controllato da un apposito algoritmo (detto
+ \textsl{algoritmo di Nagle}, vedi sez.\ref{sez:tcp_protocol_xxx}).
+ Il comportamento normale prevede invece che i pacchetti siano accumulati
+ fintanto che non si raggiunge una quantità di dati considerata adeguata per
+ eseguire la trasmissione.
+
+ Impostando questa opzione si disabilita questo meccanismo ed i pacchetti
+ vengono inviati immediatamente qualunque sia la loro dimensione; l'opzione
+ viene sovrascritta dall'eventuale impostazione \const{TCP\_CORK} (che blocca
+ l'invio immediato), tuttavia quando la si abilita viene sempre forzato lo
+ scaricamento della coda di invio (con conseguente trasmissione di tutti i
+ pacchetti pendenti), anche qualora si fosse già abilitata \const{TCP\_CORK}.
+
+\item[\const{TCP\_MAXSEG}] permette di leggere e modificare il valore della
+ \itindex{Maximum~Segment~Size} MSS dei pacchetti uscenti, e se l'opzione è
+ impostata prima di stabilire la connessione, cambia anche il valore della
+ MSS annunciata all'altro capo della connessione. Se si specificano valori
+ maggiori della MTU questi verranno ignorati, inoltre TCP imporrà anche i
+ suoi limiti massimo e minimo per questo valore.
+
+\item[\const{TCP\_CORK}] quando questa opzione viene abilitata non vengono
+ inviati pacchetti di dati fintanto che essa non venga disabilitata; a quel
+ punto tutti i pacchetti rimasti in coda saranno inviati.
\item[\const{TCP\_KEEPINTVL}]
\textbf{Descrizione}\\
\hline
\hline
- \const{UDP\_CORK} &$\bullet$&$\bullet$&&\texttt{}& %???
- .\\
- \const{UDP\_ENCAP} &$\bullet$&$\bullet$&&\texttt{}& %???
- .\\
+ \const{UDP\_CORK} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
+ accumula tutti i dati su un unico pacchetto.\\
+ \const{UDP\_ENCAP} &$\bullet$&$\bullet$&$\bullet$&\texttt{int}& %???
+ non documentata.\\
\hline
\end{tabular}
\caption{Le opzioni per i socket UDP disponibili al livello
\const{SIOCGPGRP} e \const{SIOCSPGRP}.
+\subsection{L'uso di \func{ioctl} per l'accesso ai dispositivi di rete}
+\label{sec:sock_ioctl_netdevice}
+
+Benché non strettamente attinenti alla gestione dei socket, vale la pena di
+trattare qui l'interfaccia di accesso a basso livello ai dispositivi di rete
+che viene appunto fornita attraverso la funzione \texttt{ioctl}. Questa non è
+attinente a carattestiche specifiche di un qualche protocollo, ma si applica a
+tutti i socket, indipendentemente dal tipo o famiglia dello stesso, e permette
+di impostare e rilevare le funzionalità delle interfacce di rete.
+
+\begin{figure}[!htb]
+ \footnotesize \centering
+ \begin{minipage}[c]{15cm}
+ \includestruct{listati/ifreq.h}
+ \end{minipage}
+ \caption{La struttura \structd{ifreq} utilizzata dalle \func{ioctl} per le
+ operazioni di controllo sui dispositivi di rete.}
+ \label{fig:netdevice_ifreq_struct}
+\end{figure}
+
+Tutte le operazioni di questo tipo utilizzano come terzo argomento di
+\func{ioctl} il puntatore ad una struttura \struct{ifreq}, la cui definizione
+è illustrata in fig.~\ref{fig:netdevice_ifreq_struct}. Normalmente si utilizza
+il primo campo della struttura, \var{ifr\_name} per specificare il nome
+dell'interfaccia su cui si vuole operare (ad esempio \texttt{eth0},
+\texttt{ppp0}, ecc.), e si inseriscono (o ricevono) i valori relativi alle
+diversa carateristiche e funzionalità nel secondo campo, che come si può
+notare è definito come una \ctyp{union} proprio in quanto il suo significato
+varia a secondo dell'operazione scelta.
+
+Si tenga inoltre presente che alcune di queste operazioni (in particolare
+quelle che modificano le caratteristiche dell'interfaccia) sono privilegiate e
+richiedono i privilegi di amministatore o la \itindex{capabilities}
+\textit{capability} \const{CAP\_NET\_ADMIN}, altrimenti si otterrà un errore
+di \errval{EPERM}. Le costanti che identificano le operazioni disponibili
+sono le seguenti:
+\begin{basedescript}{\desclabelwidth{2.7cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGIFNAME}] questa è l'unica operazione che usa il campo
+ \var{ifr\_name} per restituire un risultato, tutte le altre lo utilizzano
+ per indicare l'interfaccia sulla quale operare. L'operazione richiede che si
+ indichi nel campo \var{ifr\_ifindex} il valore numerico dell'\textsl{indice}
+ dell'interfaccia, e restituisce il relativo nome in \var{ifr\_name}.
+
+ Il kernel infatti assegna ad ogni interfaccia un numero progressivo, detto
+ appunto \textit{interface index}, che è quello che effettivamente la
+ identifica nelle operazioni a basso livello, il nome dell'interfaccia è
+ soltanto una etichetta associata a detto \textsl{indice}, che permette di
+ rendere più comprensibile l'indicazione dell'interfaccia all'interno dei
+ comandi; si può ottenere un elenco delle interfacce che contiene anche il
+ valore del relativo indice usando il comando \cmd{ip link}.
+
+\item[\const{SIOCGIFINDEX}] restituisce nel campo \var{ifr\_ifindex} il valore
+ numerico dell'indice dell'interfaccia specificata con \var{ifr\_name}, è in
+ sostanza l'operazione inversa di \const{SIOCGIFNAME}.
+
+\item[\const{SIOCGIFFLAGS}] permette di ottenere nel campo \var{ifr\_flags} il
+ valore corrente dei flag dell'interfaccia specificata. Il valore restituito
+ è una maschera binaria i cui bit sono identificabili attraverso le varie
+ costanti di tab.~\ref{tab:netdevice_iface_flag}.
+
+\begin{table}[htb]
+ \centering
+ \footnotesize
+ \begin{tabular}[c]{|l|p{8cm}|}
+ \hline
+ \textbf{Flag} & \textbf{Significato} \\
+ \hline
+ \hline
+ \const{IFF\_UP} & l'interfaccia è attiva.\\
+ \const{IFF\_BROADCAST} & l'interfaccia ha impostato un indirizzo di
+ \itindex{broadcast} \textit{broadcast} valido.\\
+ \const{IFF\_DEBUG} & è attivo il flag interno di debug.\\
+ \const{IFF\_LOOPBACK} & l'interfaccia è una interfaccia di
+ \textit{loopback}.\\
+ \const{IFF\_POINTOPOINT}& l'interfaccia è associata ad un collegamento
+ \textsl{punto-punto}.\\
+ \const{IFF\_RUNNING} & l'interfaccia ha delle risorse allocate (non può
+ quindi essere disattivata).\\
+ \const{IFF\_NOARP} & l'interfaccia ha il protocollo ARP disabilitato o
+ l'indirizzo del livello di rete non è impostato.\\
+ \const{IFF\_PROMISC} & l'interfaccia è in \index{modo~promiscuo}
+ \textsl{modo promiscuo} (riceve cioè tutti i
+ pacchetti che vede passare, compresi quelli non
+ direttamente indirizzati a lei).\\
+ \const{IFF\_NOTRAILERS}& evita l'uso di \textit{trailer} nei pacchetti.\\
+ \const{IFF\_ALLMULTI} & riceve tutti i pacchetti di \itindex{multicast}
+ \textit{multicast}.\\
+ \const{IFF\_MASTER} & l'interfaccia è il master di un bundle per il
+ bilanciamento di carico.\\
+ \const{IFF\_SLAVE} & l'interfaccia è uno slave di un bundle per il
+ bilanciamento di carico.\\
+ \const{IFF\_MULTICAST} & l'interfaccia ha il supporto per il
+ \textit{multicast} \itindex{multicast} attivo.\\
+ \const{IFF\_PORTSEL} & l'interfaccia può impostare i suoi parametri
+ hardware (con l'uso di \struct{ifmap})..\\
+ \const{IFF\_AUTOMEDIA} & l'interfaccia è in grado di selezionare
+ automaticamente il tipo di collegamento.\\
+ \const{IFF\_DYNAMIC} & gli indirizzi assegnati all'interfaccia vengono
+ persi quando questa viene disattivata.\\
+% \const{IFF\_} & .\\
+ \hline
+ \end{tabular}
+ \caption{Le costanti che identificano i vari bit della maschera binaria
+ \var{ifr\_flags} che esprime i flag di una interfaccia di rete.}
+ \label{tab:netdevice_iface_flag}
+\end{table}
+
+
+\item[\const{SIOCSIFFLAGS}] permette di impostare il valore dei flag
+ dell'interfaccia attraverso il valore della maschera binaria da passare nel
+ campo \var{ifr\_flags}, che può essere ottenuta con l'OR aritmetico delle
+ costanti di tab.~\ref{tab:netdevice_iface_flag}; questa operazione è
+ privilegiata.
+
+\item[\const{SIOCGIFMETRIC}] .
+\item[\const{SIOCSIFMETRIC}] .
+\item[\const{SIOCGIFMTU}] .
+\item[\const{SIOCSIFMTU}] .
+\item[\const{SIOCGIFHWADDR}] .
+\item[\const{SIOCSIFHWADDR}] .
+\item[\const{SIOCSIFHWBROADCAST}] .
+\item[\const{SIOCGIFMAP}] .
+\item[\const{SIOCSIFMAP}] .
+\item[\const{SIOCADDMULTI}] .
+\item[\const{SIOCDELMULTI}] .
+\item[\const{SIOCGIFTXQLEN}] .
+\item[\const{SIOCSIFTXQLEN}] .
+\item[\const{SIOCSIFNAME}] .
+\item[\const{SIOCGIFCONF}] .
+\end{basedescript}
+
+
+
\subsection{L'uso di \func{ioctl} per i socket TCP e UDP}
\label{sec:sock_ioctl_IP}
-Oltre alle caratteristiche che si possono impostare per i socket generici, la
+Non esistono operazioni specifiche per i socket IP in quanto tali,\footnote{a
+ parte forse \const{SIOCGIFCONF}, che però resta attinente alle proprietà
+ delle interfacce di rete, per cui l'abbiamo trattata in
+ sez.~\ref{sec:sock_ioctl_netdevice} insieme alle altre che comunque si
+ applicano anche ai socket IP.} mentre per i pacchetti di altri protocolli
+trasportati su IP, qualora li si gestisca attraverso dei socket, si dovrà fare
+riferimento direttamente all'eventuale supporto presente per il tipo di socket
+usato: ad esempio si possono ricevere pacchetti ICMP con socket di tipo
+\texttt{raw}, nel qual caso si dovrà fare riferimento alle operazioni di
+quest'ultimo.
+
+Tuttavia la gran parte dei socket utilizzati nella programmazione di rete
+utilizza proprio il protocollo IP, e quello che succede è che in realtà la
funzione \func{ioctl} consente di effettuare alcune operazioni specifiche per
-i socket UDP e TCP. Non esistono operazioni specifiche per i socket IP
-generici, mentre per i pacchetti di altri protocolli trasportati su IP,
-qualora li si gestisca attraverso dei socket, si dovrà fare riferimento
-direttamente all'eventuale supporto presente per il tipo di socket usato (ad
-esempio si possono ricevere pacchetti ICMP con socket di tipo \texttt{raw},
-nel qual caso si dovrà fare riferimento alle operazioni di quest'ultimo).
-
-Le operazioni di controllo disponibili per i socket TCP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, prevedono come
-possibile valore per il secondo argomento della funzione dalle costanti
+i socket che usano questo protocollo, ma queste vendono eseguite, invece che a
+livello di IP, al successivo livello di trasporto, vale a dire in maniera
+specifica per i socket TCP e UDP.
+
+Le operazioni di controllo disponibili per i socket TCP sono illustrate dalla
+relativa pagina di manuale, accessibile con \texttt{man 7 tcp}, e prevedono
+come possibile valore per il secondo argomento della funzione le costanti
illustrate nell'elenco seguente; il terzo argomento della funzione, gestito
come \itindex{value~result~argument} \textit{value result argument}, deve
essere sempre il puntatore ad una variabile di tipo \ctyp{int}:
\errval{EINVAL}.
\end{basedescript}
-Le operazioni di controllo disponibili per i socket UDP, come illustrate dalla
-relativa pagina di manuale, accessibile con \texttt{man 7 udp}, sono quelle
-indicate dalle costanti del seguente elenco; come per i socket TCP il terzo
-argomento viene gestito come \itindex{value~result~argument} \textit{value
- result argument} e deve essere un puntatore ad una variabile di tipo
-\ctyp{int}:
+Le operazioni di controllo disponibili per i socket UDP, anch'esse illustrate
+dalla relativa pagina di manuale accessibile con \texttt{man 7 udp}, sono
+quelle indicate dalle costanti del seguente elenco; come per i socket TCP il
+terzo argomento viene gestito come \itindex{value~result~argument}
+\textit{value result argument} e deve essere un puntatore ad una variabile di
+tipo \ctyp{int}:
\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
\item[\const{FIONREAD}] restituisce la dimensione in byte del primo pacchetto
in attesa di ricezione, o 0 qualora non ci sia nessun pacchetto.