Correzioni per l'introduzione
[gapil.git] / elemtcp.tex
index 6cf1129c91857f2cc05c01db1d79ce6d1767a04f..ba1760aea3ca9009c2ed08ff282d43f5c7cee225 100644 (file)
 \label{cha:elem_TCP_sock}
 
 In questo capitolo iniziamo ad approfondire la conoscenza dei socket TCP,
 \label{cha:elem_TCP_sock}
 
 In questo capitolo iniziamo ad approfondire la conoscenza dei socket TCP,
-tratteremo qui dunque il funzionamento delle varie funzioni che si sono usate
-nei due esempi elementari forniti in precedenza (vedi
-\secref{sec:net_cli_sample} e \secref{sec:net_serv_sample}), previa una
-descrizione delle principali caratteristiche del funzionamento di una
-connessione TCP.
+tratteremo qui dunque le varie funzioni che si sono usate nei due esempi
+elementari forniti nel capitolo precedente (vedi \secref{sec:net_cli_sample} e
+\secref{sec:net_serv_sample}), previa una descrizione delle principali
+caratteristiche del funzionamento di una connessione TCP.
 
 
 \section{Il funzionamento di una connessione TCP}
 \label{sec:TCPel_connession}
 
 Prima di entrare nei dettagli delle funzioni usate nelle applicazioni che
 
 
 \section{Il funzionamento di una connessione TCP}
 \label{sec:TCPel_connession}
 
 Prima di entrare nei dettagli delle funzioni usate nelle applicazioni che
-utilizzano i socket TCP, è fondamentale spiegare alcune basi del funzionamento
-del TCP; la conoscenza del funzionamento del protocollo è infatti essenziale
-per capire il modello di programmazione ed il funzionamento delle API.
-
-In particolare ci concentreremo sulle modalità con le quali il protocollo dà
-inizio e conclude una connessione; faremo inoltre anche un breve accenno al
-significato di alcuni dei vari stati che il protocollo assume durante la vita
-di una connessione, che possono essere osservati per ciascun
-socket\index{socket} attivo con l'uso del programma \cmd{netstat}.
+utilizzano i socket TCP, è fondamentale spiegare alcune delle basi del
+funzionamento del protocollo poiché questa conoscenza è essenziale per
+comprendere il comportamento di dette funzioni per questi socket, ed il
+relativo modello di programmazione.
+
+Il protocollo TCP serve a creare degli \textit{stream socket}, cioè un canale
+di comunicazione che stabilisce una connessione fra due stazioni, in modo che
+queste possano scambiarsi i dati. In questo capitolo ci concentreremo sulle
+modalità con le quali il protocollo dà inizio e conclude una connessione e
+faremo inoltre un breve accenno al significato di alcuni dei vari stati che
+questa viene ad assumere durante la sua vita.
 
 \subsection{La creazione della connessione: il \textit{three way handshake}}
 \label{sec:TCPel_conn_cre}
 
 \subsection{La creazione della connessione: il \textit{three way handshake}}
 \label{sec:TCPel_conn_cre}
@@ -55,7 +56,7 @@ creazione di una connessione 
   \textsl{apertura attiva}, dall'inglese \textit{active open}. La chiamata di
   \func{connect} blocca il processo e causa l'invio da parte del client di un
   segmento SYN,\footnote{Si ricordi che il segmento è l'unità elementare di
   \textsl{apertura attiva}, dall'inglese \textit{active open}. La chiamata di
   \func{connect} blocca il processo e causa l'invio da parte del client di un
   segmento SYN,\footnote{Si ricordi che il segmento è l'unità elementare di
-    dati trasmessa dal protocollo TCP al livello superiore; tutti i segmenti
+    dati trasmessa dal protocollo TCP al livello successivo; tutti i segmenti
     hanno un header che contiene le informazioni che servono allo
     \textit{stack TCP} (così viene di solito chiamata la parte del kernel che
     implementa il protocollo) per realizzare la comunicazione, fra questi dati
     hanno un header che contiene le informazioni che servono allo
     \textit{stack TCP} (così viene di solito chiamata la parte del kernel che
     implementa il protocollo) per realizzare la comunicazione, fra questi dati
@@ -700,10 +701,7 @@ Per specificare un indirizzo generico con IPv4 si usa il valore
 \const{INADDR\_ANY}, il cui valore, come visto anche negli esempi precedenti
 è pari a zero, nell'esempio \figref{fig:net_serv_code} si è usata
 un'assegnazione immediata del tipo:
 \const{INADDR\_ANY}, il cui valore, come visto anche negli esempi precedenti
 è pari a zero, nell'esempio \figref{fig:net_serv_code} si è usata
 un'assegnazione immediata del tipo:
-
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-serv_add.sin_addr.s_addr = htonl(INADDR_ANY);   /* connect from anywhere */
-\end{lstlisting}
+\includecodesnip{listati/serv_addr_sin_addr.c}
 
 Si noti che si è usato \func{htonl} per assegnare il valore
 \const{INADDR\_ANY}, benché essendo questo pari a zero il riordinamento sia
 
 Si noti che si è usato \func{htonl} per assegnare il valore
 \const{INADDR\_ANY}, benché essendo questo pari a zero il riordinamento sia
@@ -741,9 +739,7 @@ Per questo motivo nell'header \file{netinet/in.h} 
 \const{in6addr\_any} (dichiarata come \direct{extern}, ed inizializzata dal
 sistema al valore \const{IN6ADRR\_ANY\_INIT}) che permette di effettuare una
 assegnazione del tipo:
 \const{in6addr\_any} (dichiarata come \direct{extern}, ed inizializzata dal
 sistema al valore \const{IN6ADRR\_ANY\_INIT}) che permette di effettuare una
 assegnazione del tipo:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
-serv_add.sin6_addr = in6addr_any;   /* connect from anywhere */
-\end{lstlisting}
+\includecodesnip{listati/serv_addr_sin6_addr.c}
 in maniera analoga si può utilizzare la variabile \const{in6addr\_loopback}
 per indicare l'indirizzo di \textit{loopback}, che a sua volta viene
 inizializzata staticamente a \const{IN6ADRR\_LOOPBACK\_INIT}.
 in maniera analoga si può utilizzare la variabile \const{in6addr\_loopback}
 per indicare l'indirizzo di \textit{loopback}, che a sua volta viene
 inizializzata staticamente a \const{IN6ADRR\_LOOPBACK\_INIT}.
@@ -1121,61 +1117,11 @@ rispetto al precedente esempio. Al solito il sorgente completo del server
 \file{ElemDaytimeTCPCuncServ.c} è allegato nella directory dei sorgenti.
 
 \begin{figure}[!htb]
 \file{ElemDaytimeTCPCuncServ.c} è allegato nella directory dei sorgenti.
 
 \begin{figure}[!htb]
-  \footnotesize
-  \begin{lstlisting}{}
-#include <sys/types.h>   /* predefined types */
-#include <unistd.h>      /* include unix standard library */
-#include <arpa/inet.h>   /* IP addresses conversion utililites */
-#include <sys/socket.h>  /* socket library */
-#include <stdio.h>       /* include standard I/O library */
-#include <time.h>
-
-int main(int argc, char *argv[])
-{
-    int list_fd, conn_fd;
-    int i;
-    struct sockaddr_in serv_add, client;
-    char buffer[MAXLINE];
-    socklen_t len;
-    time_t timeval;
-    pid_t pid;
-    int logging=0;
-     ...
-    /* write daytime to client */
-    while (1) {
-        if ( (conn_fd = accept(list_fd, (struct sockaddr *)&client, &len)) 
-             <0 ) {
-            perror("accept error");
-            exit(-1);
-        }
-        /* fork to handle connection */
-        if ( (pid = fork()) < 0 ){
-            perror("fork error");
-            exit(-1);
-        }
-        if (pid == 0) {                 /* child */
-            close(list_fd);
-            timeval = time(NULL);
-            snprintf(buffer, sizeof(buffer), "%.24s\r\n", ctime(&timeval));
-            if ( (write(conn_fd, buffer, strlen(buffer))) < 0 ) {
-                perror("write error");
-                exit(-1);
-            }
-            if (logging) {
-                inet_ntop(AF_INET, &client.sin_addr, buffer, sizeof(buffer));
-                printf("Request from host %s, port %d\n", buffer,
-                       ntohs(client.sin_port));
-            }
-            close(conn_fd);
-            exit(0);
-        } else {                        /* parent */
-            close(conn_fd);
-        }
-    }
-    /* normal exit, never reached */
-    exit(0);
-}
-  \end{lstlisting}
+  \footnotesize \centering
+  \begin{minipage}[c]{15cm}
+    \includecodesample{listati/ElemDaytimeTCPCuncServ.c}
+  \end{minipage} 
+  \normalsize
   \caption{Esempio di codice di un server concorrente elementare per il 
     servizio daytime.}
   \label{fig:TCPel_serv_code}
   \caption{Esempio di codice di un server concorrente elementare per il 
     servizio daytime.}
   \label{fig:TCPel_serv_code}