Skip to content
/linux-syscalls

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

ArchitectureNuméroABIPoint d'entrée
x86 (i386)363i386sys_listen
x64 (x86_64)50commonsys_listen
ARM64 (aarch64)201—sys_listen

Historique noyau

Introduit dans Linux 1.0.

  1. 1.0

    listen() est présent dans Linux depuis 1.0 avec la sémantique d'origine BSD.

  2. 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)                            = 0

listen() 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).

Syscalls liés