ИМЯ¶
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