Подтвердить что ты не робот

Listen() игнорирует аргумент отставания?

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

У меня 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 для каждого Nth SYN (n > 3), отправленного с клиента и помещенного в очередь для прослушивания, вместо того, чтобы быть отброшен. Что может быть неправильным? Я прочитал man-страницы прослушивания (2) и tcp (7) и нашел:

Поведение аргумента backlog в сокетах TCP изменено в Linux 2.2. Теперь он определяет длину очереди для полностью установленных сокетов, ожидающих принятия, вместо количества незавершенных запросов на соединение. Максимальная длина очереди для неполных сокетов может устанавливаться с использованием        /Труды/системы/нетто/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().

4b9b3361

Ответ 1

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

POSIX говорит:

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

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

Ответ 2

Различные операционные системы предоставляют различное количество подключенных в очередь соединений с разными номерами невыполненных заказов. FreeBSD, по-видимому, является одной из немногих ОС, которая фактически имеет сопоставление 1 к 1. (источник: http://books.google.com/books?id=ptSC4LpwGA0C&lpg=PA108&ots=Kq9FQogkTr&dq=berkeley%20listen%20backlog%20ack&pg=PA108#v=onepage&q=berkeley%20listen%20backlog%20ack&f=false)