Finita sigaction (preliminare)
[gapil.git] / simpltcp.tex
index e592f2f634978b84ad570d8beb44d43cd59fcf71..f210f219e3114717d0138eab1bea059b441f98ad 100644 (file)
@@ -8,13 +8,13 @@ comunicazione in entrambe le direzioni.
 Inoltre prenderemo in esame, oltre al comportamento in condizioni normali,
 anche tutti i possibili scenari particolari (errori, sconnessione della rete,
 crash del client o del server durante la connessione) che possono avere luogo
-durante l'impiego di unapplicazione di rete.
+durante l'impiego di un'applicazione di rete.
 
 
 \section{Il servizio \texttt{echo}}
 \label{sec:TCPsimp_echo}
 
-L'applicazione scelta come esempio sarà unimplementazione elementare, ma
+L'applicazione scelta come esempio sarà un'implementazione elementare, ma
 completa, del servizio \texttt{echo}. Il servizio \texttt{echo} è uno dei
 servizi standard solitamente provvisti direttamente dal superserver
 \cmd{inetd}, ed è definito dall'RFC~862. Come dice il nome il servizio deve
@@ -35,16 +35,16 @@ risponde alle richieste di un client; tutto quello che cambia nel caso si una
 applicazione più complessa è la elaborazione dell'input del client da parte
 del server nel fornire le risposte in uscita. 
 
-Partiremo da unimplementazione elementare che dovrà essere rimaneggiata di
+Partiremo da un'implementazione elementare che dovrà essere rimaneggiata di
 volta in volta per poter tenere conto di tutte le evenienze che si possono
-manifestare nella vita reale di unapplicazione di rete, fino ad arrivare ad
-unimplementazione completa.
+manifestare nella vita reale di un'applicazione di rete, fino ad arrivare ad
+un'implementazione completa.
 
 \subsection{La struttura del server}
 \label{sec:TCPsimp_server_main}
 
 La prima versione del server, \file{ElemEchoTCPServer.c}, si compone di un
-corpo principale, costituito dalla funzione \func{main}.  Questa si incarica
+corpo principale, costituito dalla funzione \code{main}.  Questa si incarica
 di creare il socket, metterlo in ascolto di connessioni in arrivo e creare un
 processo figlio a cui delegare la gestione di ciascuna connessione.  Questa
 parte, riportata in \nfig, è analoga a quella vista nel precedente esempio
@@ -106,7 +106,7 @@ int main(int argc, char *argv[])
     exit(0);
 }
   \end{lstlisting}
-  \caption{Codice della funzione \texttt{main} della prima versione del server
+  \caption{Codice della funzione \code{main} della prima versione del server
     per il servizio \texttt{echo}.}
   \label{fig:TCPsimpl_serv_code}
 \end{figure}
@@ -116,12 +116,12 @@ quella dell'esempio citato, ed ad esso si applicano le considerazioni fatte in
 \secref{sec:TCPel_cunc_daytime}. Le uniche differenze rispetto all'esempio in
 \figref{fig:TCPel_serv_code} sono che in questo caso per il socket in
 ascolto viene usata la porta 7 e tutta la gestione della comunicazione è
-delegata alla funzione \func{ServEcho}.
+delegata alla funzione \code{ServEcho}.
 %  Per ogni connessione viene creato un
 % processo figlio, il quale si incarica di lanciare la funzione
 % \texttt{SockEcho}.
 
-Il codice della funzione \func{ServEcho} è invece mostrata in \nfig, la
+Il codice della funzione \code{ServEcho} è invece mostrata in \nfig, la
 comunicazione viene gestita all'interno del ciclo (linee \texttt{\small
   6--8}).  I dati inviati dal client vengono letti dal socket con una semplice
 \func{read} (che ritorna solo in presenza di dati in arrivo), la riscrittura
@@ -145,7 +145,7 @@ void ServEcho(int sockfd) {
     return;
 }
   \end{lstlisting}
-  \caption{Codice della prima versione della funzione \func{ServEcho} per la
+  \caption{Codice della prima versione della funzione \code{ServEcho} per la
     gestione del servizio \texttt{echo}.}
   \label{fig:TCPsimpl_server_elem_sub}
 \end{figure}
@@ -204,14 +204,14 @@ int main(int argc, char *argv[])
   \label{fig:TCPsimpl_client_elem}
 \end{figure}
 
-La funzione \func{main} si occupa della creazione del socket e della
+La funzione \code{main} si occupa della creazione del socket e della
 connessione (linee \texttt{\small 10--27}) secondo la stessa modalità spiegata
 in \secref{sec:net_cli_sample}, il client si connette sulla porta 7
 all'indirizzo specificato dalla linea di comando (a cui si è aggiunta una
 elementare gestione delle opzioni non riportata in figura).
 
 Completata la connessione (quando la funzione \func{connect} ritorna) la
-funzione \func{ClientEcho}, riportata in \nfig, si preoccupa di gestire la
+funzione \code{ClientEcho}, riportata in \nfig, si preoccupa di gestire la
 comunicazione, leggendo una riga alla volta dallo \file{stdin}, scrivendola
 sul socket e ristampando su \file{stdout} quanto ricevuto in risposta dal
 server. 
@@ -240,9 +240,9 @@ void ClientEcho(FILE * filein, int socket)
 La funzione utilizza due buffer per gestire i dati inviati e letti sul socket
 (\texttt{\small 3}).  La comunicazione viene gestita all'interno di un ciclo
 (linee \texttt{\small 5--10}), i dati da inviare sulla connessione vengono
-presi dallo \texttt{stdin} usando la funzione \func{fgets} che legge una
+presi dallo \file{stdin} usando la funzione \func{fgets} che legge una
 linea di testo (terminata da un \texttt{CR} e fino al massimo di
-\texttt{MAXLINE} caratteri) e la salva sul buffer di invio, la funzione
+\macro{MAXLINE} caratteri) e la salva sul buffer di invio, la funzione
 \func{SockWrite} (\texttt{\small 3}) scrive detti dati sul socket (gestendo
 l'invio multiplo qualora una singola \func{write} non basti, come spiegato
 in \secref{sec:sock_io_behav}).
@@ -262,7 +262,7 @@ il client esce.
 
 Benché il codice dell'esempio precedente sia molto ridotto, esso ci permetterà
 di considerare in dettaglio tutte le problematiche che si possono incontrare
-nello scrivere unapplicazione di rete. Infatti attraverso l'esame delle sue
+nello scrivere un'applicazione di rete. Infatti attraverso l'esame delle sue
 modalità di funzionamento normali, all'avvio e alla terminazione, e di quello
 che avviene nelle varie situazioni limite, da una parte potremo approfondire
 la comprensione del protocollo TCP/IP e dall'altra ricavare le indicazioni
@@ -307,10 +307,10 @@ tcp        0      0 roke:echo               gont:32981              ESTABLISHED
 \end{verbatim}
 mentre per quanto riguarda l'esecuzione dei programmi avremo che:
 \begin{itemize}
-\item il client chiama la funzione \func{ClientEcho} che si blocca sulla
+\item il client chiama la funzione \code{ClientEcho} che si blocca sulla
   \func{fgets} dato che non si è ancora scritto nulla sul terminale.
 \item il server eseguirà una \func{fork} facendo chiamare al processo figlio
-  la funzione \func{ServEcho}, quest'ultima si bloccherà sulla \func{read}
+  la funzione \code{ServEcho}, quest'ultima si bloccherà sulla \func{read}
   dal socket sul quale ancora non sono presenti dati.
 \item il processo padre del server chiamerà di nuovo \func{accept}
   bloccandosi fino all'arrivo di un'altra connessione.
@@ -357,7 +357,7 @@ punto avremo:
 tcp        0      0 *:echo                  *:*                     LISTEN
 tcp        0      0 localhost:33032         localhost:echo          TIME_WAIT
 \end{verbatim} %$
-con il client che entra in \macro{TIME\_WAIT}.
+con il client che entra in \texttt{TIME\_WAIT}.
 
 Esaminiamo allora in dettaglio la sequenza di eventi che porta alla
 terminazione normale della connessione, che ci servirà poi da riferimento nei
@@ -366,24 +366,24 @@ casi seguenti:
 \begin{enumerate}
 \item inviando un carattere di EOF da terminale la \func{fgets} ritorna
   restituendo un puntatore nullo che causa l'uscita dal ciclo di
-  while, così la \func{ClientEcho} ritorna.
-\item al ritorno di \func{ClientEcho} ritorna anche la funzione \func{main}, e
+  while, così la \code{ClientEcho} ritorna.
+\item al ritorno di \code{ClientEcho} ritorna anche la funzione \code{main}, e
   come parte del processo terminazione tutti i file descriptor vengono chiusi
   (si ricordi quanto detto in \secref{sec:proc_term_conclusion}); questo causa
   la chiusura del socket di comunicazione; il client allora invierà un FIN al
   server a cui questo risponderà con un ACK.  A questo punto il client verrà a
-  trovarsi nello stato \macro{FIN\_WAIT\_2} ed il server nello stato
-  \macro{CLOSE\_WAIT} (si riveda quanto spiegato in
+  trovarsi nello stato \texttt{FIN\_WAIT\_2} ed il server nello stato
+  \texttt{CLOSE\_WAIT} (si riveda quanto spiegato in
   \secref{sec:TCPel_conn_term}).
 \item quando il server riceve il FIN la \func{read} del processo figlio che
   gestisce la connessione ritorna restituendo 0 causando così l'uscita dal
-  ciclo di while e il ritorno di \func{ServEcho}, a questo punto il processo
+  ciclo di while e il ritorno di \code{ServEcho}, a questo punto il processo
   figlio termina chiamando \func{exit}.
 \item all'uscita del figlio tutti i file descriptor vengono chiusi, la
   chiusura del socket connesso fa sì che venga effettuata la sequenza finale
   di chiusura della connessione, viene emesso un FIN dal server che riceverà
   un ACK dal client, a questo punto la connessione è conclusa e il client
-  resta nello stato \func{TIME\_WAIT}.
+  resta nello stato \texttt{TIME\_WAIT}.
 \item 
 \end{enumerate}
 
@@ -411,3 +411,8 @@ processo (si veda \secref{sec:proc_wait}), cosa che faremo utilizzando il
 segnale, per questo installeremo un manipolatore usando la funzione
 \func{Signal} (trattata in dettaglio in \secref{sec:sig_signal}).
 
+
+%%% Local Variables: 
+%%% mode: latex
+%%% TeX-master: "gapil"
+%%% End: