listen () длина очереди в сокете-программирование в c?
я написал две пары кодов(server.c
и client.c
) в Linux. Один для UNIX-домена AF_UNIX
другое для интернет-домена AF_INET
. Оба работают нормально!
listen()
называется для длины очереди отставания = 3 на both servers
listen(sockfd, 3);
в домене UNIX (AF_UNIX): пока один клиент подключен к серверу, если я попытаюсь подключить больше клиентов к серверу. Трое стоят в очереди, а запрос четвертого отклоняется. (как я и хотел-3 в очереди ожидания).
в интернет-домене (AF_INET): запрос более трех хранятся в очереди ожидания.
почему запрос от четвертого клиента не отклоняется, даже если длина очереди отставания равна трем? И почему поведение listen()
(и другие) зависит от протокола?
2 ответов
операционные системы фактически используют большие очереди для входящих TCP-соединений, чем указано в listen()
. Насколько больше, зависит от операционной системы.
listen(int socket_fd, int backlog)
для данного прослушивающего сокета ядро поддерживает две очереди.
- неполная очередь подключения - для которой SYN был получен, но трехстороннее рукопожатие (TCP) не выполняется полностью. (Состояние SYN_RCV)
- полная очередь подключения-трехстороннее рукопожатие сделано. (Установленное состояние)
задел аргумент исторически определяет сумму обеих очередей. Но формального определения того, что задел средства.
реализация, полученная из Беркли, добавляет фактор выдумки к отставанию. Так что общая очередь length = factor * backlog
.
очень подробное и глубокое объяснение, данное в книге У. Ричарда Стивенса. Также таблицу, показывающую значения для семи операционных систем, можно найти в Stevens, Fenner, Rudoff, "Сетевое программирование Unix: сетевой API сокетов", Том 1, Третье Издание, Стр. 108.
платформа имеет право регулировать указанное отставание вверх или вниз в соответствии с его минимумом и его значением по умолчанию. В наши дни дефолт больше похож на 500, чем на пять, где он начался примерно в 1983 году. Вы не можете полагаться на то, что это то, что вы указали, и нет API для выяснения того, что это на самом деле, и нет очевидной причины для допустимого приложения, чтобы оно было короче, чем по умолчанию.