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 di lunghezza pari
a \texttt{backlog}. La funzione si può applicare solo a socket di tipo
\subsection{La funzione \texttt{accept}}
\label{sec:TCPel_func_accept}
+La funzione \texttt{accept} è chiamata da un server TCP per gestire la
+connessione una volta che sia stato completato il three way handshake, la
+funzione restituisce un nuovo socket descriptor su cui si potrà operare per
+effettuare la comunicazione. Se non ci sono connessioni completate il processo
+viene messo in attesa. Il prototipo della funzione è il seguente:
\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:
+ La funzione estrae la prima connessione completa relativa al socket
+ \texttt{sockfd} in attesa sulla coda delle connessioni complete che associa
+ nuovo socket con le stesse caratteristiche di \texttt{sockfd} (restituito
+ dalla funzione stessa). Il socket originale non viene toccato. Nella
+ struttura \texttt{addr} e nella variabile \texttt{addrlen} vengono
+ restituiti indirizzo e relativa lunghezza del client che si è connesso.
+
+ La funzione restituisce un numero di socket descriptor positivo in caso di
+ successo e -1 in caso di errore, nel qual caso la variabile \texttt{errno}
+ viene settata ai seguenti valori:
+
\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.
-
+ 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.
-
+ 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
\end{errlist}
\end{prototype}
-\section{Una semplice implementazione del servizio \texttt{echo} su TCP}
-\label{sec:TCPel_echo_example}
+La funzione può essere usata solo con socket che supportino la connessione
+(cioè di tipo \texttt{SOCK\_STREAM}, \texttt{SOCK\_SEQPACKET} o
+\texttt{SOCK\_RDM}). Per alcuni protocolli che richiedono una conferma
+esplicita della connessione, (attualmenente 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 \texttt{read} o una \texttt{write} mentre il rifiuto
+della connessione viene fatta con la funzione \texttt{close}.
+I due parametri \texttt{cliaddr} e \texttt{addrlen} (si noti che quest'ultimo
+è passato per indirizzo per avere indietro il valore) sono usati per ottenere
+l'indirizzo del client da cui proviene la connessione. Prima della chiamata
+\texttt{addrlen} deve essere inizializzato alle dimensioni della struttura il
+cui indirizzo è passato come parametro in \texttt{cliaddr}, al rientro della
+funzione \texttt{addrlen} conterrà il numero di bytes scritti dentro
+\texttt{cliaddr}.
+Se la funzione ha successo restituisce un nuovo socket descriptor, detto
+\textit{connected socket}, su cui è agganciata la connessione che il client
+TCP ha effettuato verso il socket \texttt{sockfd}. Quest'ultimo, che viene
+chiamato invece \textit{listening socket}, deve essere stato creato in
+precedenza e messo in ascolto con \texttt{listen}, e non viene toccato dalla
+funzione.
+Questa distinzione è essenziale per capire
+\section{Una semplice implementazione del servizio \texttt{echo} su TCP}
+\label{sec:TCPel_echo_example}
+
+Veniamo ora ad una applicazione