Completata listen. Scritto prototipo di accept
authorSimone Piccardi <piccardi@gnulinux.it>
Sun, 13 May 2001 18:26:26 +0000 (18:26 +0000)
committerSimone Piccardi <piccardi@gnulinux.it>
Sun, 13 May 2001 18:26:26 +0000 (18:26 +0000)
elemtcp.tex

index ca1a94b3562ba63454d58d278a53beda70dc3ede..a2e77f9c86ca273db11957889223a728b0ae4e86 100644 (file)
@@ -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à
 \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
+  \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
   \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{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}
 
   \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
 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}
 
 
 \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}
 \section{Una semplice implementazione del servizio \texttt{echo} su TCP}
 \label{sec:TCPel_echo_example}
+
+
+
+
+
+