+Tratteremo in questa sezione le caratteristiche specifiche delle funzioni
+\func{ioctl} e \func{fcntl} quando esse vengono utilizzate con dei socket
+generici. Quanto già detto in precedenza in sez.~\ref{sec:file_fcntl} e
+sez.~\ref{sec:file_ioctl} continua a valere; quello che tratteremo qui sono le
+operazioni ed i comandi che sono validi, o che hanno significati peculiari,
+quando queste funzioni vengono applicate a dei socket generici.
+
+Nell'elenco seguente si riportano i valori specifici che può assumere il
+secondo argomento della funzione \func{ioctl} (\param{request}, che indica il
+tipo di operazione da effettuare) quando essa viene applicata ad un socket
+generico. Nell'elenco si illustrerà anche, per ciascuna operazione, il tipo di
+dato usato come terzo argomento della funzione ed il significato che esso
+viene ad assumere. Dato che in caso di lettura questi dati vengono restituiti
+come \itindex{value~result~argument} \textit{value result argument}, con
+queste operazioni il terzo argomento deve sempre essere passato come puntatore
+ad una variabile (o struttura) precedentemente allocata. Le costanti che
+identificano le operazioni sono le seguenti:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCGSTAMP}] restituisce il contenuto di una struttura
+ \struct{timeval} con la marca temporale dell'ultimo pacchetto ricevuto sul
+ socket, questa operazione può essere utilizzata per effettuare delle
+ misurazioni precise del tempo di andata e ritorno\footnote{il
+ \itindex{Round~Trip~Time} \textit{Round Trip Time} cui abbiamo già
+ accennato in sez.~\ref{sec:net_tcp}.} dei pacchetti sulla rete.
+
+\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 \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
+ relativamente all'eventuale processo o \itindex{process~group}
+ \textit{process group} cui devono essere inviati i segnali \const{SIGIO} e
+ \const{SIGURG}. Come per \const{SIOCSPGRP} l'argomento passato deve un
+ puntatore ad una variabile di tipo \type{pid\_t}, con lo stesso significato.
+ Qualora non sia presente nessuna impostazione verrà restituito un valore
+ nullo.
+
+\item[\const{FIOASYNC}] Abilita o disabilita la modalità di I/O asincrono sul
+ socket. Questo significa (vedi sez.~\ref{sec:file_asyncronous_operation})
+ che verrà inviato il segnale di \const{SIGIO} (o quanto impostato con
+ \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
+ sul socket.
+\end{basedescript}
+
+Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi
+specifici; in questo caso il secondo argomento (\param{cmd}, che indica il
+comando) può assumere i due valori \const{FIOGETOWN} e \const{FIOSETOWN},
+mentre il terzo argomento dovrà essere un puntatore ad una variabile di tipo
+\type{pid\_t}. Questi due comandi sono una modalità alternativa di eseguire le
+stesse operazioni (lettura o impostazione del processo o del gruppo di
+processo che riceve i segnali) che si effettuano chiamando \func{ioctl} con
+\const{SIOCGPGRP} e \const{SIOCSPGRP}.
+
+
+\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
+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 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}:
+\begin{basedescript}{\desclabelwidth{2.5cm}\desclabelstyle{\nextlinelabel}}
+\item[\const{SIOCINQ}] restituisce la quantità di dati non ancora letti
+ 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 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}
+
+
+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 nelle 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}]
+\item[\const{TIOCOUTQ}]
+\end{basedescript}