La funzione listen serve ad usare un socket in modalità passiva, cioè, come dice il nome, per metterlo in ascolto di eventuali connessioni;9 in sostanza l'effetto della funzione è di portare il socket dallo stato CLOSED a quello LISTEN. In genere si chiama la funzione in un server dopo le chiamate a socket e bind e prima della chiamata ad accept. Il prototipo della funzione, come definito dalla pagina di manuale, è:

    * #include <sys/socket.h>
    * int listen(int sockfd, int backlog)

      Pone un socket in attesa di una connessione. 

La funzione restituisce 0 in caso di successo e -1 in caso di errore. I codici di errore restituiti in errno sono i seguenti:

    * EBADF l'argomento sockfd non è un file descriptor valido.
    * ENOTSOCK l'argomento sockfd non è un socket.
    * EOPNOTSUPP il socket è di un tipo che non supporta questa operazione.

*

La funzione pone il socket specificato da sockfd in modalità passiva e predispone una coda per le connessioni in arrivo di lunghezza pari a backlog. La funzione si può applicare solo a socket di tipo SOCK_STREAM o SOCK_SEQPACKET.

L'argomento backlog indica il numero massimo di connessioni pendenti accettate; se esso viene ecceduto il client al momento della richiesta della connessione riceverà un errore di tipo ECONNREFUSED, o se il protocollo, come accade nel caso del TCP, supporta la ritrasmissione, la richiesta sarà ignorata in modo che la connessione possa venire ritentata.

Per capire meglio il significato di tutto ciò occorre approfondire la modalità con cui il kernel tratta le connessioni in arrivo. Per ogni socket in ascolto infatti vengono mantenute due code:

   1. La coda delle connessioni incomplete (incomplete connection queue che contiene un riferimento per ciascun socket per il quale è arrivato un SYN ma il three way handshake non si è ancora concluso. Questi socket sono tutti nello stato SYN_RECV.
   2. La coda delle connessioni complete (complete connection queue che contiene un ingresso per ciascun socket per il quale il three way handshake è stato completato ma ancora accept non è ritornata. Questi socket sono tutti nello stato ESTABLISHED.

Lo schema di funzionamento è descritto in fig. 15.5: quando arriva un SYN da un client il server crea una nuova voce nella coda delle connessioni incomplete, e poi risponde con il SYN+ACK. La voce resterà nella coda delle connessioni incomplete fino al ricevimento dell'ACK dal client o fino ad un timeout. Nel caso di completamento del three way handshake la voce viene spostata nella coda delle connessioni complete. Quando il processo chiama la funzione accept (vedi sez. 15.2.4) la prima voce nella coda delle connessioni complete è passata al programma, o, se la coda è vuota, il processo viene posto in attesa e risvegliato all'arrivo della prima connessione completa.
