X-Git-Url: https://gapil.gnulinux.it/gitweb/?p=gapil.git;a=blobdiff_plain;f=elemtcp.tex;h=effafc390a905613132ba6fac9bc933a45a56072;hp=9d2df4a87e1fa3b3897929a7afc6a20ee8ef4dfd;hb=e20a546af590a50e7ac47f68f6c7d4648bb4f31a;hpb=6b667429ed5d78c967b88bda7ee33be7077096f5 diff --git a/elemtcp.tex b/elemtcp.tex index 9d2df4a..effafc3 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -128,7 +128,7 @@ regolare la connessione. Normalmente vengono usate le seguenti opzioni: \textsl{finestra annunciata} (\textit{advertized window}) con la quale ciascun capo della comunicazione dichiara quanto spazio disponibile ha in memoria per i dati. Questo è un numero a 16 bit dell'header, che così può - indicare un massimo di 65535 bytes (anche se Linux usa come massimo 32767 + indicare un massimo di 65535 byte (anche se Linux usa come massimo 32767 per evitare problemi con alcuni stack bacati che usano l'aritmetica con segno per implementare lo stack TCP); ma alcuni tipi di connessione come quelle ad alta velocità (sopra i 45Mbits/sec) e quelle che hanno grandi @@ -210,7 +210,7 @@ che si mantenga un flusso di dati dal capo della connessione che deve ancora eseguire la chiusura passiva a quello che sta eseguendo la chiusura attiva. Nella sequenza indicata i dati verrebbero persi, dato che si è chiuso il socket dal lato che esegue la chiusura attiva; esistono tuttavia situazioni in -cui si vuole poter sfuttare questa possibilità, usando una procedura che è +cui si vuole poter sfruttare questa possibilità, usando una procedura che è chiamata \textit{half-close}; torneremo su questo aspetto e su come utilizzarlo più avanti, quando parleremo della funzione \func{shutdown}. @@ -275,12 +275,12 @@ ad assumere per i due lati, server e client. \end{figure} La connessione viene iniziata dal client che annuncia un MSS di 1460 (un -valore tipico per IPv4 su ethernet) con Linux, il server risponde con lo +valore tipico per IPv4 su Ethernet) con Linux, il server risponde con lo stesso valore (ma potrebbe essere anche un valore diverso). Una volta che la connessione è stabilita il client scrive al server una richiesta (che assumiamo stare in un singolo segmento, cioè essere minore dei -1460 bytes annunciati dal server), quest'ultimo riceve la richiesta e +1460 byte annunciati dal server), quest'ultimo riceve la richiesta e restituisce una risposta (che di nuovo supponiamo stare in un singolo segmento). Si noti che l'acknowledge della richiesta è mandato insieme alla risposta, questo viene chiamato \textit{piggybacking} ed avviene tutte le @@ -955,20 +955,16 @@ viene messo in attesa. Il prototipo della funzione operazione. \item \macro{EAGAIN} o \macro{EWOULDBLOCK} il socket è stato settato come non bloccante, e non ci sono connessioni in attesa di essere accettate. - \item \macro{EFAULT} l'argomento \var{addr} . - \item \macro{EPERM} Firewall rules forbid connection. - - \item \macro{ENOBUFS, ENOMEM} Not enough free memory. This often means - that the memory allocation is limited by the socket buffer limits, not by - the system memory. - - Inoltre possono essere restituiti gli errori di rete relativi al nuovo - socket come: \macro{EMFILE}, \macro{EINVAL}, \macro{ENOSR}, - \macro{ENOBUFS}, \macro{EPERM}, \macro{ECONNABORTED}, - \macro{ESOCKTNOSUPPORT}, \macro{EPROTONOSUPPORT}, \macro{ETIMEDOUT}, - \macro{ERESTARTSYS}. - + \item \macro{EPERM} Le regole del firewall non consentono la connessione. + \item \macro{ENOBUFS, ENOMEM} . Questo spesso significa che l'allocazione + della memoria è limitata dai limiti sui buffer dei socket, non dalla + memoria di sistema. \end{errlist} + Inoltre possono essere restituiti gli errori di rete relativi al nuovo + socket come: \macro{EMFILE}, \macro{EINVAL}, \macro{ENOSR}, \macro{ENOBUFS}, + \macro{EFAULT}, \macro{EPERM}, \macro{ECONNABORTED}, + \macro{ESOCKTNOSUPPORT}, \macro{EPROTONOSUPPORT}, \macro{ETIMEDOUT}, + \macro{ERESTARTSYS}. \end{prototype} La funzione può essere usata solo con socket che supportino la connessione @@ -977,8 +973,8 @@ La funzione pu esplicita della connessione, (attualmente in Linux solo DECnet ha questo comportamento), la funzione opera solo l'estrazione dalla coda delle connessioni, la conferma della connessione viene fatta implicitamente dalla -prima chiamata ad una \func{read} o una \func{write} mentre il rifiuto -della connessione viene fatto con la funzione \func{close}. +prima chiamata ad una \func{read} o una \func{write} mentre il rifiuto della +connessione viene fatto con la funzione \func{close}. È da chiarire che Linux presenta un comportamento diverso nella gestione degli errori rispetto ad altre implementazioni dei socket BSD, infatti la funzione @@ -993,7 +989,7 @@ I due argomenti \var{cliaddr} e \var{addrlen} (si noti che quest'ultimo l'indirizzo del client da cui proviene la connessione. Prima della chiamata \var{addrlen} deve essere inizializzato alle dimensioni della struttura il cui indirizzo è passato come argomento in \var{cliaddr}, al ritorno della -funzione \var{addrlen} conterrà il numero di bytes scritti dentro +funzione \var{addrlen} conterrà il numero di byte scritti dentro \var{cliaddr}. Se questa informazione non interessa basterà inizializzare a \macro{NULL} detti puntatori. @@ -1246,7 +1242,7 @@ In generale per questo avviene quando il server invece di far gestire la connessione direttamente a un processo figlio, come nell'esempio precedente, lancia un opportuno programma per ciascuna connessione usando \func{exec} (questa ad -esempio è la modailità con cui opera il \textsl{super-server} \cmd{inetd} +esempio è la modalità con cui opera il \textsl{super-server} \cmd{inetd} che gestisce tutta una serie di servizi lanciando per ogni connessione l'opportuno server).