X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=network.tex;h=3a72f11f1f9649d6c536204bc30c94d8028afcb4;hp=531d731e53941084227b5d087f360b74da59b098;hb=a8d6fb4cf9036d69f2884d9ba9d9350f649ed401;hpb=e323f7e103dac7a264d3ef335d23540719df2623 diff --git a/network.tex b/network.tex index 531d731..3a72f11 100644 --- a/network.tex +++ b/network.tex @@ -6,9 +6,9 @@ come prerequisiti per capire la programmazione di rete ed esamineremo a grandi linee i protocolli di rete e come questi sono organizzati e interagiscono. In particolare, avendo assunto l'ottica di un'introduzione mirata alla -programmazione di rete, ci concentreremo sul protocollo più diffuso che è -quello che sta alla base di internet, ed in particolare sulle parti più -importanti ai fini della programmazione. +programmazione, ci concentreremo sul protocollo più diffuso che è quello che +sta alla base di internet, ed in particolare sulle parti più importanti ai +fini della programmazione. \section{Il modello client-server} @@ -30,7 +30,8 @@ definito insieme di servizi. Esempi di questo modello sono il WEB, ftp, telnet, ssh e praticamente ogni servizio che viene fornito tramite la rete, ma il modello è utilizzato in -generale anche per programmi di uso locale. +generale anche per programmi che non fanno necessariamente uso della rete, +come il sistema a finestre. Normalmente si dividono i server in due categorie principali, \textit{concorrenti} e \textit{iterativi}, sulla base del loro comportamento. @@ -47,6 +48,124 @@ contemporaneamente, una volta che il processo figlio ha concluso il suo lavoro viene terminato, mentre il server originale resta sempre attivo. +\subsection{Un primo esempio di client} +\label{sec:net_cli_sample} + +Per evitare di rendere l'esposizione dei concetti generali puramente teorica +iniziamo con il mostrare un semplice esempio di client TCP. In \nfig è +riportata la sezione principale del codice del nostro client elementare per il +servizio \textit{daytime}, un servizio standard che restituisce l'ora locale +della macchina a cui si effettua la richesta. + +\begin{figure}[htbp] + \footnotesize + \begin{lstlisting}{} +#include /* predefined types */ +#include /* include unix standard library */ +#include /* IP addresses conversion utiliites */ +#include /* socket library */ +#include /* include standard I/O library */ + +int main(int argc, char *argv[]) +{ + int sock_fd; + int i, nread; + struct sockaddr_in serv_add; + char buffer[MAXLINE]; + ... + /* create socket */ + if ( (sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Socket creation error"); + return -1; + } + /* initialize address */ + memset((void *) &serv_add, 0, sizeof(serv_add)); /* clear server address */ + serv_add.sin_family = AF_INET; /* address type is INET */ + serv_add.sin_port = htons(13); /* daytime post is 13 */ + /* build address using inet_pton */ + if ( (inet_pton(AF_INET, argv[optind], &serv_add.sin_addr)) <= 0) { + perror("Address creation error"); + return -1; + } + /* extablish connection */ + if (connect(sock_fd, (struct sockaddr *)&serv_add, sizeof(serv_add)) < 0) { + perror("Connection error"); + return -1; + } + /* read daytime from server */ + while ( (nread = read(sock_fd, buffer, MAXLINE)) > 0) { + buffer[nread]=0; + if (fputs(buffer, stdout) == EOF) { /* write daytime */ + perror("fputs error"); + return -1; + } + } + /* error on read */ + if (nread < 0) { + perror("Read error"); + return -1; + } + /* normal exit */ + return 0; +} + \end{lstlisting} + \caption{Esempio di codice di un semplice client per il servizio daytime.} + \label{fig:net_cli_code} +\end{figure} + + +Scopo di questo esempio è fornire un primo approccio alla programmazione di +rete, per questo motivo non ci dilungheremo nel trattare il significato dei +termini o il funzionamento delle varie funzioni utilizzate. Tutto questo sarà +esaminato in dettaglio nel seguito, per cui qui ci limiteremo a citarli senza +ulteriori spiegazioni. + +Il listato completo del programma (che comprende il trattamento delle opzioni +e una funzione per stampare un messaggio di aiuto) è allegato alla guida nella +sezione dei codici sorgente e può essere compilato su una qualunque macchina +linux. + +Il programma anzitutto include gli header necessari (\texttt{\small 1--5}); +dopo la dichiarazione delle variabili (\texttt{\small 9--12}), si è omessa +tutta la parte relativa al trattamento degli argomenti passati dalla linea di +comando effettuata con le apposite routines illustrate in +\ref{cha:parameter_options}. + +Il primo passo (\texttt{\small 14--18}è creare un \textit{socket} internet +(\texttt{AF\_INET}), di tipo TCP \texttt{SOCK\_STREAM}), la funzione ritorna +un descrittore, analogo a quello dei file, che viene usato per identificare il +socket in tutte le chiamate successive. Nel caso la chiamata fallisca si +stampa un errore con la relativa routine e si esce. + +Il passo seguente (\texttt{\small 19--27}) è quello di costruire una apposita +struttura \texttt{sockaddr\_in} in cui sarà inserito l'indirizzo del server ed +il numero della porta del servizio. Il primo passo è inizializzare tutto a +zero, poi si setta il tipo di protocollo e la porta (usando la funzione +\texttt{htons} per convertire il formato dell'intero a quello usato nella +rete), infine si utilizza la funzione \texttt{inet\_pton} per convertire +l'indirizzo numerico passato dalla linea di comando. + +Usando la funzione \texttt{connect} (\texttt{\small 28--32}) si provvede poi a +stabilire la connessione con il server. Un valore negativo + +\subsection{Un primo esempio di server} +\label{sec:net_serv_sample} + +Dopo aver visto il client facciamo vedere adesso anche il corrispettivo +server, in questo modo sarà possibile fare delle prove + +\begin{figure}[htbp] + \begin{center} + \begin{verbatim} + + + \end{verbatim} + \caption{Esempio di codice di un semplice server per il servizio daytime.} + \label{fig:net_serv_code} + \end{center} +\end{figure} + + \section{I protocolli di rete} \label{sec:net_protocols} @@ -456,6 +575,8 @@ stesso tempo, il che poi comporta che quanto dicevamo a proposito del controllo di flusso e della gestione della sequenzialità dei dati viene effettuato per entrambe le direzioni di comunicazione. + + \subsection{Creazione e terminazione della connessione TCP} Per capire il funzionamento delle funzioni della interfaccia dei socket che