X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=tcpsock.tex;h=8c50b5e5026efb5ef176b94f7bc25b59700acb2f;hp=35c5ef2cd5d73573ce76357c6ef9be0a5288ad56;hb=17bae834f41549575a11ddf444d97de8d575269e;hpb=99ef4679f4d9d22707075c7e05a4dbd3900edcd1 diff --git a/tcpsock.tex b/tcpsock.tex index 35c5ef2..8c50b5e 100644 --- a/tcpsock.tex +++ b/tcpsock.tex @@ -1545,13 +1545,13 @@ ulteriori connessioni. Si noti come il figlio operi solo sul socket connesso, chiudendo immediatamente (\texttt{\small 33}) il socket \var{list\_fd}; mentre il padre continua ad operare solo sul socket in ascolto chiudendo (\texttt{\small 48}) -\var{sock\_fd} al ritorno dalla \func{fork}. Per quanto abbiamo detto in +\var{conn\_fd} al ritorno dalla \func{fork}. Per quanto abbiamo detto in \secref{sec:TCP_func_close} nessuna delle due chiamate a \func{close} causa l'innesco della sequenza di chiusura perché il numero di riferimenti al file descriptor non si è annullato. Infatti subito dopo la creazione del socket \var{list\_fd} ha una referenza, e -lo stesso vale per \var{sock\_fd} dopo il ritorno di \func{accept}, ma dopo la +lo stesso vale per \var{conn\_fd} dopo il ritorno di \func{accept}, ma dopo la \func{fork} i descrittori vengono duplicati nel padre e nel figlio per cui entrambi i socket si trovano con due referenze. Questo fa si che quando il padre chiude \var{sock\_fd} esso resta con una referenza da parte del figlio, @@ -1649,7 +1649,7 @@ compito del client leggere la risposta del server e stamparla sullo standard output. -\subsection{Il client: prima versione} +\subsection{Il client \textit{echo}: prima versione} \label{sec:TCP_echo_client} Il codice della prima versione del client per il servizio \textit{echo}, @@ -1731,7 +1731,7 @@ programma, usato per illustriamo immediatamente. -\subsection{Il server: prima versione} +\subsection{Il server \textit{echo}: prima versione} \label{sec:TCPsimp_server_main} La prima versione del server, contenuta nel file \file{TCP\_echod\_first.c}, è @@ -2152,10 +2152,10 @@ perch interrotta dall'arrivo di \const{SIGCHLD}, è quella ad \func{accept}, che è l'unica funzione che può mettere il processo padre in stato di sleep nel periodo in cui un figlio può terminare; si noti infatti come le altre -\textit{slow system call}\footnote{si ricordi la distinzione fatta in - \secref{sec:sig_gen_beha}.} o sono chiamate prima di entrare nel ciclo -principale, quando ancora non esistono processi figli, o sono chiamate dai -figli stessi e non risentono di \const{SIGCHLD}. +\index{system call lente} \textit{slow system call}\footnote{si ricordi la + distinzione fatta in \secref{sec:sig_gen_beha}.} o sono chiamate prima di +entrare nel ciclo principale, quando ancora non esistono processi figli, o +sono chiamate dai figli stessi e non risentono di \const{SIGCHLD}. Per questo l'unica modifica sostanziale nel ciclo principale (\texttt{\small 23--42}), rispetto precedente versione di \figref{fig:TCP_ServEcho_first}, è @@ -2179,7 +2179,33 @@ ricevuto da \var{accept} viene convertito in una stringa che poi (\texttt{\small 34--39}) viene opportunamente stampata o sullo schermo o nei log. +Infine come ulteriore miglioria si è perfezionata la funzione \code{ServEcho}, +sia per tenere conto della nuova funzionalità di debugging, che per effettuare +un controllo in caso di errore; il codice della nuova versione è mostrato in +\figref{fig:TCP_ServEcho_second}. +\begin{figure}[!htb] + \footnotesize \centering + \begin{minipage}[c]{15.6cm} + \includecodesample{listati/ServEcho_second.c} + \end{minipage} + \normalsize + \caption{Codice della seconda versione della funzione \code{ServEcho} per la + gestione del servizio \textit{echo}.} + \label{fig:TCP_ServEcho_second} +\end{figure} + +Rispetto alla precedente versione di \figref{fig:TCP_ServEcho_first} in questo +caso si è provveduto a controllare (\texttt{\small 7--10}) il valore di +ritorno di \func{read} per rilevare un eventuale errore, in modo da stampare +(\texttt{\small 8}) un messaggio di errore e ritornare (\texttt{\small 9}) +concludendo la connessione. + +Inoltre qualora sia stata attivata la funzionalità di debug (avvalorando +\var{debugging} tramite l'apposita opzione \texttt{-d}) si provvederà a +stampare (tenendo conto della modalità di invocazione del server, se +interattiva o in forma di demone) il numero di byte e la stringa letta dal +client (\texttt{\small 16--24}). \section{I vari scenari critici}