-%% tcpsock.tex
+bg%% tcpsock.tex
%%
%% Copyright (C) 2000-2015 Simone Piccardi. Permission is granted to
%% copy, distribute and/or modify this document under the terms of the GNU Free
implementazioni.
In Linux il significato di questo valore è cambiato a partire dal kernel 2.2
-per prevenire l'attacco chiamato \index{SYN~flood} \textit{SYN flood}. Questo
-si basa sull'emissione da parte dell'attaccante di un grande numero di
-pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
+per prevenire l'attacco chiamato \itindex{SYN~flood} \textit{SYN
+ flood}. Questo si basa sull'emissione da parte dell'attaccante di un grande
+numero di pacchetti SYN indirizzati verso una porta, forgiati con indirizzo IP
fasullo\footnote{con la tecnica che viene detta \textit{ip spoofing}.} così
che i SYN$+$ACK vanno perduti e la coda delle connessioni incomplete viene
saturata, impedendo di fatto ulteriori connessioni.
possibili condizioni di errore dovute alla rete. Occorre allora specificare
chiaramente quali sono le condizioni per cui un socket risulta essere
``\textsl{pronto}'' quando viene passato come membro di uno dei tre
-\itindex{file~descriptor~set} \textit{file descriptor set} usati da
-\func{select}.
+\textit{file descriptor set} usati da \func{select}.
Le condizioni che fanno si che la funzione \func{select} ritorni segnalando
che un socket (che sarà riportato nel primo insieme di file descriptor) è
allegati alla guida.
In questo caso la funzione comincia (\texttt{\small 8--9}) con l'azzeramento
-del \itindex{file~descriptor~set} \textit{file descriptor set} \var{fset} e
-l'impostazione del valore \var{maxfd}, da passare a \func{select} come massimo
-per il numero di file descriptor. Per determinare quest'ultimo si usa la macro
-\code{max} definita nel nostro file \file{macro.h} che raccoglie una
-collezione di macro di preprocessore di varia utilità.
+del \textit{file descriptor set} \var{fset} e l'impostazione del valore
+\var{maxfd}, da passare a \func{select} come massimo per il numero di file
+descriptor. Per determinare quest'ultimo si usa la macro \code{max} definita
+nel nostro file \file{macro.h} che raccoglie una collezione di macro di
+preprocessore di varia utilità.
La funzione prosegue poi (\texttt{\small 10--41}) con il ciclo principale, che
viene ripetuto indefinitamente. Per ogni ciclo si reinizializza
-(\texttt{\small 11--12}) il \itindex{file~descriptor~set} \textit{file
- descriptor set}, impostando i valori per il file descriptor associato al
-socket \var{socket} e per lo standard input (il cui valore si recupera con la
-funzione \func{fileno}). Questo è necessario in quanto la successiva
-(\texttt{\small 13}) chiamata a \func{select} comporta una modifica dei due
-bit relativi, che quindi devono essere reimpostati all'inizio di ogni ciclo.
+(\texttt{\small 11--12}) il \textit{file descriptor set}, impostando i valori
+per il file descriptor associato al socket \var{socket} e per lo standard
+input (il cui valore si recupera con la funzione \func{fileno}). Questo è
+necessario in quanto la successiva (\texttt{\small 13}) chiamata a
+\func{select} comporta una modifica dei due bit relativi, che quindi devono
+essere reimpostati all'inizio di ogni ciclo.
Si noti come la chiamata a \func{select} venga eseguita usando come primo
argomento il valore di \var{maxfd}, precedentemente calcolato, e passando poi
-il solo \itindex{file~descriptor~set} \textit{file descriptor set} per il
-controllo dell'attività in lettura, negli altri argomenti sono passati tutti
-puntatori nulli, non interessando né il controllo delle altre attività, né
-l'impostazione di un valore di timeout.
+il solo \textit{file descriptor set} per il controllo dell'attività in
+lettura, negli altri argomenti sono passati tutti puntatori nulli, non
+interessando né il controllo delle altre attività, né l'impostazione di un
+valore di timeout.
Al ritorno di \func{select} si provvede a controllare quale dei due file
descriptor presenta attività in lettura, cominciando (\texttt{\small 14--24})
prima (\texttt{\small 19}) si imposta opportunamente \var{eof} ad un valore
non nullo, dopo di che (\texttt{\small 20}) si effettua la chiusura del lato
in scrittura del socket con \func{shutdown}. Infine (\texttt{\small 21}) si
-usa la macro \macro{FD\_CLR} per togliere lo standard input dal
-\itindex{file~descriptor~set} \textit{file descriptor set}.
+usa la macro \macro{FD\_CLR} per togliere lo standard input dal \textit{file
+ descriptor set}.
In questo modo anche se la lettura del file in ingresso è conclusa, la
funzione non esce dal ciclo principale (\texttt{\small 11--50}), ma continua
alto.} che verrà anche (\texttt{\small 4}) inserito nella tabella.
La prima sezione (\texttt{\small 7--10}) del ciclo principale esegue la
-costruzione del \itindex{file~descriptor~set} \textit{file descriptor set}
-\var{fset} in base ai socket connessi in un certo momento; all'inizio ci sarà
-soltanto il socket in ascolto, ma nel prosieguo delle operazioni, verranno
-utilizzati anche tutti i socket connessi registrati nella tabella
-\var{fd\_open}. Dato che la chiamata di \func{select} modifica il valore del
-\itindex{file~descriptor~set} \textit{file descriptor set}, è necessario
-ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi procedere
-con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket trovati
-attivi.
+costruzione del \textit{file descriptor set} \var{fset} in base ai socket
+connessi in un certo momento; all'inizio ci sarà soltanto il socket in
+ascolto, ma nel prosieguo delle operazioni, verranno utilizzati anche tutti i
+socket connessi registrati nella tabella \var{fd\_open}. Dato che la chiamata
+di \func{select} modifica il valore del \textit{file descriptor set}, è
+necessario ripetere (\texttt{\small 7}) ogni volta il suo azzeramento, per poi
+procedere con il ciclo (\texttt{\small 8--10}) in cui si impostano i socket
+trovati attivi.
Per far questo si usa la caratteristica dei file descriptor, descritta in
sez.~\ref{sec:file_open_close}, per cui il kernel associa sempre ad ogni nuovo
diverso da zero; in questo modo se l'unico socket con attività era quello
connesso, avendo opportunamente decrementato il contatore, il ciclo verrà
saltato, e si ritornerà immediatamente (ripetuta l'inizializzazione del
-\itindex{file~descriptor~set} \textit{file descriptor set} con i nuovi valori
-nella tabella) alla chiamata di \func{accept}. Se il socket attivo non è
-quello in ascolto, o ce ne sono comunque anche altri, il valore di \var{n} non
-sarà nullo ed il controllo sarà eseguito. Prima di entrare nel ciclo comunque
-si inizializza (\texttt{\small 28}) il valore della variabile \var{i} che
-useremo come indice nella tabella \var{fd\_open} al valore minimo,
-corrispondente al file descriptor del socket in ascolto.
+\textit{file descriptor set} con i nuovi valori nella tabella) alla chiamata
+di \func{accept}. Se il socket attivo non è quello in ascolto, o ce ne sono
+comunque anche altri, il valore di \var{n} non sarà nullo ed il controllo sarà
+eseguito. Prima di entrare nel ciclo comunque si inizializza (\texttt{\small
+ 28}) il valore della variabile \var{i} che useremo come indice nella tabella
+\var{fd\_open} al valore minimo, corrispondente al file descriptor del socket
+in ascolto.
Il primo passo (\texttt{\small 30}) nella verifica è incrementare il valore
dell'indice \var{i} per posizionarsi sul primo valore possibile per un file
queste problematiche con i socket. Abbiamo però visto in
sez.~\ref{sec:file_multiplexing} come la funzione \func{poll} possa costituire
una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo
- delle limitazioni dovute all'uso dei \itindex{file~descriptor~set}
- \textit{file descriptor set}.}
+ delle limitazioni dovute all'uso dei \textit{file descriptor set}.}
Ancora una volta in sez.~\ref{sec:file_poll} abbiamo trattato la funzione in
maniera generica, parlando di file descriptor, ma come per \func{select}
Come si può notare la logica del programma è identica a quella vista in
fig.~\ref{fig:TCP_SelectEchod} per l'analogo server basato su \func{select};
la sola differenza significativa è che in questo caso non c'è bisogno di
-rigenerare i \itindex{file~descriptor~set} \textit{file descriptor set} in
-quanto l'uscita è indipendente dai dati in ingresso. Si applicano comunque
-anche a questo server le considerazioni finali di
-sez.~\ref{sec:TCP_serv_select}.
-
+rigenerare i \textit{file descriptor set} in quanto l'uscita è indipendente
+dai dati in ingresso. Si applicano comunque anche a questo server le
+considerazioni finali di sez.~\ref{sec:TCP_serv_select}.