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