LISTEN(2)

ИМЯ
listen - слушать соединения на сокете

ОБЗОР
#include <sys/socket.h>

int listen(int s, int backlog);

ОПИСАНИЕ
Для того, чтобы принимать соединения, сначала нужно создать сокет с помощью socket(2), затем выразить готовность принимать входящие соединения и задать размер очереди с помощью listen, а затем вызывать accept(2) по мере появления новых соединений. Системный вызов listen применим только к сокетам типа SOCK_STREAM или SOCK_SEQPACKET.

Параметр backlog задает максимальную длину, до которой может расти очередь ожидающих соединений. Если приходит запрос на соединение, а очередь полна, то клиент получит ошибку ECONNREFUSED или, если соответствующие протокол поддерживает повторную передачу, запрос может быть игнорирован, чтобы попытаться ответить на повторный запрос.

ЗАМЕЧАНИЯ
Поведение параметра backlog на TCP-сокетах изменилось в Linux 2.2. Теперь вместо количества неоконченных запросов на соединение он задает размер очереди для полностью установленных соединений, ожидающих, пока процесс примет их. Максимальный размер очереди для неоконченных сокетов может быть задано, используя sysctl tcp_max_syn_backlog. Когда разрешено использование syncookies, логическая максимальная длина отсутствует и настройка этого sysctl игнорируется. См. tcp(7) за дальнейшей информацией.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха возвращается ноль. При ошибке возвращается -1, а errno устанавливается должным образом.

ОШИБКИ

EADDRINUSE
    Другой сокет уже слушает на этом же порту.

EBADF
    Аргумент s не является правильным дескриптором.

ENOTSOCK
    Аргумент s не является сокетом.

EOPNOTSUPP
    Тип сокета не поддерживает операцию listen.

СООТВЕТСТВИЕ СТАНДАРТАМ
Single Unix, 4.4BSD, черновик POSIX 1003.1g. Вызов listen впервые появился в 4.2BSD.

ОШИБКИ РЕАЛИЗАЦИИ
Если сокет имеет тип AF_INET, а аргумент backlog больше, чем константа SOMAXCONN (128 в Linux 2.0 & 2.2), то он незаметно обрезается до SOMAXCONN. Не полагайтесь на это значение в портабельных приложениях, потому что BSD и некоторые её потомки ограничивают размер очереди до 5.

СМОТРИ ТАКЖЕ
accept(2), connect(2), socket(2)

ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 1999, Виктор Вислобоков <corochoone@perm.ru> 2003