Réseau · Section 2
listen(2)
Marque une socket comme passive — prête à accepter des connexions entrantes.
Signature
#include <sys/socket.h>
int listen(int sockfd, int backlog);- sockfd
- Descripteur socket, de type SOCK_STREAM ou SOCK_SEQPACKET et préalablement bind()é.
- backlog
- Longueur maximale de la file accept. Bornée à net.core.somaxconn. Valeurs courantes : 128 pour de petits démons, 1024+ pour serveurs à fort trafic.
Description
listen() marque la socket désignée par sockfd comme passive, c'est-à-dire utilisée pour accepter des demandes de connexion via accept(). backlog définit la longueur maximale de la file des connexions en attente ayant terminé la poignée de main TCP mais pas encore accept()ées ; si une demande arrive avec la file pleine, le client réessaye (ou, avec tcp_abort_on_overflow, reçoit un RST). listen() n'a de sens que sur SOCK_STREAM ou SOCK_SEQPACKET. Le noyau plafonne backlog à /proc/sys/net/core/somaxconn (par défaut 4096 sur les noyaux modernes), silencieusement. Une file séparée des connexions semi-ouvertes (SYN_RECV) est dimensionnée par tcp_max_syn_backlog et protégée par les SYN cookies en cas de débordement.
Numéros par architecture
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 363 | i386 | sys_listen |
| x64 (x86_64) | 50 | common | sys_listen |
| ARM64 (aarch64) | 201 | — | sys_listen |
Historique noyau
Introduit dans Linux 1.0.
1.0
listen() est présent dans Linux depuis 1.0 avec la sémantique d'origine BSD.
4.4
Le support TCP Fast Open (TFO) côté serveur est arrivé ; positionner TCP_FASTOPEN via setsockopt() fait que listen() retourne une socket acceptant SYN+données dans le même paquet, économisant un RTT sur les connexions ultérieures du même client.
seccomp & conteneurs
Docker default profile
Autorisé
Podman default profile
Autorisé
listen() est dans tous les profils par défaut. Pas de levier de filtrage d'arguments utile — les valeurs de backlog ne sont pas sensibles. Le filtrage seccomp se fait en amont au socket() (refuser AF_PACKET / AF_NETLINK) et au bind() (BPF cgroup pour les restrictions de port). Les charges qui ne devraient jamais être serveur (jobs batch one-shot, init containers) peuvent refuser listen() en garde-fou.
libseccomp
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(listen), 0);Exemple strace
$ strace -e listen nc -l 0
listen(3, 1) = 0listen() isolé tient sur une ligne — son intérêt est comme marqueur de phase. Dans une trace de démarrage serveur on attend socket() → setsockopt(SO_REUSEADDR) → bind() → listen() ; un démon qui saute l'une de ces étapes et passe direct à accept() est bogué. -e network capture toute la phase de mise en place.
Sécurité & observabilité
Un listen() inattendu dans une charge qui ne devrait être que cliente est un signal fort : nombre de portes dérobées ouvrent un bind shell ici. Le tracepoint eBPF sys_enter_listen plus la corrélation de sockfd au bind() d'origine (cache du sys_enter_bind) donne l'IP+port d'écoute immédiatement — sans avoir à poller ss/netstat. Les runtimes de conteneurs (Falco, Tracee) intègrent souvent des règles « listen inattendu » liées aux labels de charge. Sur hôtes durcis, /proc/sys/net/core/somaxconn doit être réglé explicitement (pas laissé au défaut distro) pour empêcher le rognage silencieux sous flood SYN.
Erreurs
- EADDRINUSE
- Une autre socket écoute déjà sur le même port.
- EBADF
- sockfd n'est pas un descripteur valide.
- ENOTSOCK
- sockfd ne désigne pas une socket.
- EOPNOTSUPP
- Le type de socket ne supporte pas listen() (par ex. UDP, brut).