X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsockadv.tex;h=c93dc4ac08b11a16419313a89b1beb90abc53a79;hp=28b2318a09a93b8c6dfa69213563f4020d855c7c;hb=577f268d8395cbd4db85c3b9ca3a7b387ba4ff0f;hpb=0c3c06a023684951f7f1e189d270cf322c0dfe31 diff --git a/tcpsockadv.tex b/tcpsockadv.tex index 28b2318..c93dc4a 100644 --- a/tcpsockadv.tex +++ b/tcpsockadv.tex @@ -688,20 +688,70 @@ conseguente blocco del server su di una \func{write}. Le possibili soluzioni in questo caso sono quelle di ritornare ad eseguire il ciclo di risposta alle richieste all'interno di processi separati, utilizzare un timeout per le operazioni di scrittura, o eseguire queste ultime in -modalità non bloccante, cocludendo le operazioni qualora non vadano a buon +modalità non bloccante, concludendo le operazioni qualora non vadano a buon 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 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, per tenere conto della diversa sintassi delle due funzioni, +ma la struttura del programma resta sostanzialmente la stessa. + + +\begin{figure}[!htbp] + \footnotesize \centering + \begin{minipage}[c]{15.6cm} + \includecodesample{listati/poll_echod.c} + \end{minipage} + \normalsize + \caption{La sezione principale del codice della nuova versione di server + \textit{echo} basati sull'uso della funzione \func{poll}.} + \label{fig:TCP_PollEchod} +\end{figure} + +In \figref{fig:TCP_PollEchod} è riportata la sezione principale della nuova +versione del server, la versione completa del codice è riportata nel file +\file{poll\_echod.c} dei sorgenti allegati alla guida. Al solito si sono +tralasciate \section{Le opzioni dei socket}