\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
\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}
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.
\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}
+
+
+
+
+
+