Aggiunti i due esempi di pselect lasciati indietro, specificato il
[gapil.git] / tcpsockadv.tex
index 28b2318a09a93b8c6dfa69213563f4020d855c7c..c8e9ec4ace77b08e43c309aaffb01e43d0136737 100644 (file)
@@ -693,15 +693,52 @@ fine.
 
 
 
-\subsection{Un esempio di I/O multiplexing con \func{poll}}
+\subsection{I/O multiplexing con \func{poll}}
 \label{sec:TCP_serv_poll}
 
-Abbiamo visto in \secref{sec:TCP_serv_select} come creare un server che
-utilizzi l'I/O multiplexing attraverso l'impiego della funzione \func{select},
-ma in \secref{sec:file_multiplexing} abbiamo visto come la funzione
-\func{poll} costituisca una alternativa a \func{select} con delle funzionalità
-migliori, vediamo allora come reimplementare il nostro servizio usando questa
-funzione.
+Finora abbiamo trattato le problematiche risolubili con l'I/O multiplexing
+impiegando la funzione \func{select}; questo è quello che avviene nella
+maggior parte dei casi, in quanto essa è nata sotto BSD proprio per affrontare
+queste problematiche con i socket.  Abbiamo però visto in
+\secref{sec:file_multiplexing} come esistono altre funzioni che permettono di
+affrontare lo stesso problema e come la funzione \func{poll} possa costituire
+una alternativa a \func{select}, con alcuni vantaggi.\footnote{non soffrendo
+  delle limitazioni dovute all'uso dei \textit{file descriptor set}.}
+
+Ancora una volta in \secref{sec:file_poll} abbiamo trattato la funzione in
+maniera generica, parlando di file descriptor, ma come per \func{select}
+quando si ha a che fare con dei socket il concetto di essere \textsl{pronti}
+per l'I/O deve essere specificato nei dettagli, per tener conto delle
+condizioni della rete. Inoltre deve essere specificato come viene classificato
+il traffico nella suddivisione fra dati normali e prioritari. In generale
+pertanto:
+\begin{itemize}
+\item i dati trasmessi su un socket vengono considerati traffico normale,
+  pertanto vengono rilevati da una selezione con \const{POLLIN} o
+  \const{POLLRDNORM}.
+\item i dati \textit{out-of-band} su un socket TCP vengono considerati
+  traffico prioritario e vengono rilevati da una condizione \const{POLLIN},
+  \const{POLLPRI} o \const{POLLRDBAND}.
+\item la chiusura di una connessione (cioè la ricezione di un segmento FIN)
+  viene considerato traffico normale, pertanto viene rilevato da una
+  condizione \const{POLLIN} o \const{POLLRDNORM}, ma una conseguente chiamata
+  a \func{read} restituirà 0.
+\item la presenza di un errore sul socket (sia dovuta ad un segmento RST che a
+  timeout) viene considerata traffico normale, ma viene segnalata anche dalla
+  condizione \const{POLLERR}.
+\item la presenza di una nuova connessione su un socket in ascolto può essere
+  considerata sia traffico normale che prioritario, nel caso di Linux
+  l'implementazione la classifica come normale.
+\end{itemize}
+
+Come esempio dell'uso di \func{poll} proviamo allora a reimplementare il
+server \textit{echo} secondo lo schema di \figref{fig:TCP_echo_multiplex}
+usando \func{poll} al posto di \func{select}. In questo caso dovremo fare
+qualche modifica, 
+
+
+
+
 
 
 \section{Le opzioni dei socket}