X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=ba1760aea3ca9009c2ed08ff282d43f5c7cee225;hp=6cf1129c91857f2cc05c01db1d79ce6d1767a04f;hb=877a1d6577ab41ce13b0a2794b73885d98e0d7cc;hpb=adbc2a4478d606025705a406603e6097584b9fa0 diff --git a/elemtcp.tex b/elemtcp.tex index 6cf1129..ba1760a 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -12,26 +12,27 @@ \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 -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} @@ -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 - 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 @@ -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: - -\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 @@ -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: -\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}. @@ -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] - \footnotesize - \begin{lstlisting}{} -#include /* predefined types */ -#include /* include unix standard library */ -#include /* IP addresses conversion utililites */ -#include /* socket library */ -#include /* include standard I/O library */ -#include - -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}