From: Simone Piccardi Date: Sun, 13 May 2001 18:26:26 +0000 (+0000) Subject: Completata listen. Scritto prototipo di accept X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=commitdiff_plain;h=597e090affe725734ce571d29d6fae420f2a5d75;p=gapil.git Completata listen. Scritto prototipo di accept --- diff --git a/elemtcp.tex b/elemtcp.tex index ca1a94b..a2e77f9 100644 --- a/elemtcp.tex +++ b/elemtcp.tex @@ -826,8 +826,8 @@ man page \begin{prototype}{sys/socket.h}{int listen(int sockfd, int backlog)} La funzione pone il socket specificato da \texttt{sockfd} in modalità - passiva e predispone una coda per le connessioni in arrivo pari a - \texttt{backlog}. La funzione si può applicare solo a socket di tipo + passiva e predispone una coda per le connessioni in arrivo di lunghezza pari + a \texttt{backlog}. La funzione si può applicare solo a socket di tipo \texttt{SOCK\_STREAM} o \texttt{SOCK\_SEQPACKET}. La funzione restituisce 0 in caso di successo e -1 in caso di errore. I @@ -836,8 +836,8 @@ man page \item \texttt{EBADF} L'argomento \texttt{sockfd} non è un file descriptor valido. \item \texttt{ENOTSOCK} L'argomento \texttt{sockfd} non è un socket. - \item \texttt{EOPNOTSUPP} The socket is not of a type that supports the lis­ - ten operation. + \item \texttt{EOPNOTSUPP} Il socket è di un tipo che non supporta questa + operazione. \end{errlist} \end{prototype} @@ -899,7 +899,25 @@ La scelta storica per il valore di questo parametro kernel non supportavano neanche valori superiori, ma la situazione corrente è molto cambiata dagli anni '80 e con server web che possono sopportare diversi milioni di connessioni al giorno un tale valore non è più adeguato. Non esiste -comunque una risposta univoca +comunque una risposta univoca per la scelta del valore, per questo non +conviene specificare questo valore con una costante (il cui cambiamento +richiederebbe la ricompilazione del server) ma usare piuttosto una variabile +di ambiente (vedi \secref{sec:xxx_env_var}). Lo Stevens tratta accuratamente +questo argomento, con esempi presi da casi reali su web server, ed in +particolare evidenzia come non sia più vero che la ragione della coda è quella +di gestire il caso in cui il server è occupato fra chiamate successive alla +\texttt{accept} (per cui la coda più occupata sarebbe quella delle connessioni +compeltate), ma è invece necessaria a gestire la presenza di un gran numero di +SYN in attesa di completare il three-way handshake. + +Come accennato nel caso del TCP se un SYN arriva con tutte le code piene, il +pacchetto sarà ignorato. Questo viene fatto perché la condizione delle code +piene è transitoria, e se il client ristrasmette il SYN è probabile che +passato un po' di tempo possa trovare lo spazio per una nuova connessione. Se +invece si rispondesse con un RST la \texttt{connect} del client ritornerebbe +con una condizione di errore, mentre questo è il tipico caso in cui è si può +lasciare la gestione della connessione alla ritrasmissione prevista dal +protocollo TCP. @@ -907,5 +925,39 @@ comunque una risposta univoca \label{sec:TCPel_func_accept} + +\begin{prototype}{sys/socket.h}{int listen(int sockfd, struct sockaddr *addr, + socklen_t *addrlen); } + + La funzione restituisce 0 in caso di successo e ... . I + codici di errore restituiti in \texttt{errno} sono i seguenti: + \begin{errlist} + \item \texttt{EBADF} L'argomento \texttt{sockfd} non è un file descriptor + valido. + \item \texttt{ENOTSOCK} L'argomento \texttt{sockfd} non è un socket. + \item \texttt{EOPNOTSUPP} Il socket è di un tipo che non supporta questa + operazione. + + \item \texttt{EAGAIN} or \item \texttt{EWOULDBLOCK} Il socket è stato + settato come non bloccante, e non ci sono connessioni in attesa di essere + accettate. + + \item \texttt{EFAULT} The addr parameter is not in a writable part of the + user address space. + + \item \texttt{EPERM} Firewall rules forbid connection. + + \item \texttt{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. + \end{errlist} +\end{prototype} + \section{Una semplice implementazione del servizio \texttt{echo} su TCP} \label{sec:TCPel_echo_example} + + + + + +