%% sockctrl.tex
%%
-%% Copyright (C) 2004-2012 Simone Piccardi. Permission is granted to
+%% Copyright (C) 2004-2014 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
%% Documentation License, Version 1.1 or any later version published by the
%% Free Software Foundation; with the Invariant Sections being "Prefazione",
prima (\texttt{\small 6}) azzera il contenuto della struttura \var{hint} e poi
provvede (\texttt{\small 7--9}) ad inizializzarne i valori necessari per la
chiamata (\texttt{\small 10}) a \func{getaddrinfo}. Di quest'ultima si
-controlla (\texttt{\small 12-16}) il codice di ritorno, in modo da stampare un
+controlla (\texttt{\small 12--16}) il codice di ritorno, in modo da stampare un
avviso di errore, azzerare \var{errno} ed uscire in caso di errore. Dato che
ad una macchina possono corrispondere più indirizzi IP, e di tipo diverso (sia
IPv4 che IPv6), mentre il servizio può essere in ascolto soltanto su uno solo
di questi, si provvede a tentare la connessione per ciascun indirizzo
-restituito all'interno di un ciclo (\texttt{\small 18-40}) di scansione della
+restituito all'interno di un ciclo (\texttt{\small 18--40}) di scansione della
lista restituita da \func{getaddrinfo}, ma prima (\texttt{\small 17}) si salva
il valore del puntatore per poterlo riutilizzare alla fine per disallocare la
lista.
fallisce si controlla (\texttt{\small 20}) se sono disponibili altri
indirizzi, nel qual caso si passa al successivo (\texttt{\small 21}) e si
riprende (\texttt{\small 22}) il ciclo da capo; se non ve ne sono si stampa
-l'errore ritornando immediatamente (\texttt{\small 24-27}). Quando la
+l'errore ritornando immediatamente (\texttt{\small 24--27}). Quando la
creazione del socket ha avuto successo si procede (\texttt{\small 29})
direttamente con la connessione, di nuovo in caso di fallimento viene ripetuto
(\texttt{\small 30--38}) il controllo se vi sono o no altri indirizzi da
rispettiva struttura degli indirizzi.
Come già detto la funzione è analoga a \texttt{sockconn} ed inizia azzerando
-ed inizializzando (\texttt{\small 6-11}) opportunamente la struttura
+ed inizializzando (\texttt{\small 6--11}) opportunamente la struttura
\var{hint} con i valori ricevuti come argomenti, soltanto che in questo caso
si è usata (\texttt{\small 8}) una impostazione specifica dei flag di
\var{hint} usando \const{AI\_PASSIVE} per indicare che il socket sarà usato
-per una apertura passiva. Per il resto la chiamata (\texttt{\small 12-18}) a
+per una apertura passiva. Per il resto la chiamata (\texttt{\small 12--18}) a
\func{getaddrinfo} e ed il ciclo principale (\texttt{\small 20--42}) sono
identici, solo che si è sostituita (\texttt{\small 31}) la chiamata a
\func{connect} con una chiamata a \func{bind}. Anche la conclusione
% Documentation/networking/timestamping.txt
+% TOFO documentare SO_REUSEPORT introdotta con il kernel 3.9, vedi
+% http://git.kernel.org/linus/c617f398edd4db2b8567a28e899a88f8f574798d
+
\end{basedescript}
In realtà tutto quello che si è fatto è stato introdurre nella nuova funzione
(\texttt{\small 1}) un nuovo argomento intero, \param{reuse}, che conterrà il
valore logico da usare nella successiva chiamata (\texttt{\small 14}) a
-\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13-17}) che
+\func{setsockopt}. Si è poi aggiunta una sezione (\texttt{\small 13--17}) che
esegue l'impostazione dell'opzione fra la chiamata a \func{socket} e quella a
\func{bind}.
valore di default di questa variabile è nullo, ma usando l'opzione \texttt{-r}
nell'invocazione del server (al solito la gestione delle opzioni non è
riportata in fig.~\ref{fig:TCP_echod_fifth}) se ne potrà impostare ad 1 il
-valore, per cui in tal caso la successiva chiamata (\texttt{\small 13-17}) a
+valore, per cui in tal caso la successiva chiamata (\texttt{\small 13--17}) a
\func{setsockopt} attiverà l'opzione \const{SO\_REUSEADDR}.
\begin{figure}[!htbp]
introdotta una opzione ulteriore, \const{SO\_REUSEPORT} che richiede che detta
opzione sia specificata per tutti i socket per i quali si vuole eseguire il
\textit{completely duplicate binding}. Nel caso di Linux questa opzione non
-esiste, ma il comportamento di \const{SO\_REUSEADDR} è analogo, sarà cioè
-possibile effettuare un \textit{completely duplicate binding} ed ottenere il
-successo di \func{bind} su un socket legato allo stesso indirizzo e porta solo
-se il programma che ha eseguito per primo \func{bind} su di essi ha impostato
-questa opzione.\footnote{questa restrizione permette di evitare il cosiddetto
- \textit{port stealing}, in cui un programma, usando \const{SO\_REUSEADDR},
- può collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad
- un altro programma; con questa caratteristica ciò è possibile soltanto se il
+esisteva fino al kernel 3.9, ma il comportamento di \const{SO\_REUSEADDR} è
+analogo, sarà cioè possibile effettuare un \textit{completely duplicate
+ binding} ed ottenere il successo di \func{bind} su un socket legato allo
+stesso indirizzo e porta solo se il programma che ha eseguito per primo
+\func{bind} su di essi ha impostato questa opzione.\footnote{questa
+ restrizione permette di evitare parzialmente il cosiddetto \textit{port
+ stealing}, in cui un programma, usando \const{SO\_REUSEADDR}, può
+ collegarsi ad una porta già in uso e ricevere i pacchetti destinati ad un
+ altro programma; con questa caratteristica ciò è possibile soltanto se il
primo programma a consentirlo, avendo usato fin dall'inizio
- \const{SO\_REUSEADDR}.}
+ \const{SO\_REUSEADDR}.}
+
+% TODO documentare SO_REUSEPORT, vedi https://lwn.net/Articles/542260/
+
\index{costante!{SO\_REUSEADDR}@{{\tt {SO\_REUSEADDR}}}|)}
Benché la maggior parte delle caratteristiche dei socket sia gestibile con le
funzioni \func{setsockopt} e \func{getsockopt}, alcune proprietà possono
essere impostate attraverso le funzioni \func{fcntl} e \func{ioctl} già
-trattate in sez.~\ref{sec:file_fcntl} e sez.~\ref{sec:file_ioctl}; in
-quell'occasione abbiamo parlato di queste funzioni esclusivamente nell'ambito
-della loro applicazione a file descriptor associati a dei file normali; qui
-tratteremo invece i dettagli del loro utilizzo con file descriptor associati a
-dei socket.
+trattate in sez.~\ref{sec:file_fcntl_ioctl}; in quell'occasione abbiamo
+parlato di queste funzioni esclusivamente nell'ambito della loro applicazione
+a file descriptor associati a dei file normali; qui tratteremo invece i
+dettagli del loro utilizzo con file descriptor associati a dei socket.
\subsection{L'uso di \func{ioctl} e \func{fcntl} per i socket generici}
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.
+generici. Quanto già detto in precedenza sez.~\ref{sec:file_fcntl_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
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 \signal{SIGIO} (o quanto impostato con
- \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl}) in caso di eventi di I/O
- sul socket.
+ socket. Questo significa (vedi sez.~\ref{sec:signal_driven_io}) che verrà
+ inviato il segnale di \signal{SIGIO} (o quanto impostato con
+ \const{F\_SETSIG}, vedi sez.~\ref{sec:file_fcntl_ioctl}) in caso di eventi
+ di I/O sul socket.
\end{basedescript}
Nel caso dei socket generici anche \func{fcntl} prevede un paio di comandi