listen() игнорирует аргумент backlog?

У меня есть следующая проблема:

я имею sockfd = socket(AF_INET, SOCK_STREAM, 0)

После того, как я настроил и связал сокет (скажем, с sockfd.sin_port = htons(666)) Я сразу делаю

listen(sockfd, 3);

sleep(50); // for test purposes

Я сплю в течение 50 секунд, чтобы проверить аргумент backlog, который, кажется, игнорируется, потому что я могу установить соединение * более 3 раз на порт 666.

*: Я имею в виду, что я получаю syn/ack для каждого N-го SYN (n>3), отправленного клиентом и помещенного в очередь прослушивания, вместо того, чтобы быть отброшенным. Что может быть не так? Я прочитал страницы руководства по listen(2) и tcp(7) и обнаружил:

Поведение аргумента backlog на TCP-сокетах изменилось в Linux 2.2. Теперь он задает длину очереди для полностью установленных сокетов, ожидающих принятия, вместо количества незавершенных запросов на подключение. Максимальная длина очереди для незавершенных сокетов может быть установлена ​​с помощью /proc/sys/net/ipv4/tcp_max_syn_backlog. Когда синхронизированные файлы включены, логическая максимальная длина отсутствует, и этот параметр игнорируется. Смотрите tcp(7) для получения дополнительной информации.

, но даже с sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2 а также sysctl -w net.ipv4.tcp_syncookies=0Я все еще получаю те же результаты! Я должен что-то упустить или совершенно не понимаю listen()Отставание цель.

2 ответа

Аргумент отставания listen() является только консультативным.

POSIX говорит:

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

Текущие версии ядра Linux округляют его до следующей максимальной степени двух, с минимумом 16. Соответствующий код находится в reqsk_queue_alloc ().

Разные операционные системы предоставляют разное количество подключений в очереди с разными номерами невыполненных работ. Похоже, что FreeBSD является одной из немногих операционных систем, которая имеет отображение 1: 1. (источник: http://books.google.com/books?id=ptSC4LpwGA0C&lpg=PA108&ots=Kq9FQogkTr&dq=berkeley%20listen%20backlog%20ack&pg=PA108)

Другие вопросы по тегам