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)  

для данного прослушивающего сокета ядро поддерживает две очереди.

  1. неполная очередь подключения - для которой SYN был получен, но трехстороннее рукопожатие (TCP) не выполняется полностью. (Состояние SYN_RCV)
  2. полная очередь подключения-трехстороннее рукопожатие сделано. (Установленное состояние)

задел аргумент исторически определяет сумму обеих очередей. Но формального определения того, что задел средства.

реализация, полученная из Беркли, добавляет фактор выдумки к отставанию. Так что общая очередь length = factor * backlog.

очень подробное и глубокое объяснение, данное в книге У. Ричарда Стивенса. Также таблицу, показывающую значения для семи операционных систем, можно найти в Stevens, Fenner, Rudoff, "Сетевое программирование Unix: сетевой API сокетов", Том 1, Третье Издание, Стр. 108.


платформа имеет право регулировать указанное отставание вверх или вниз в соответствии с его минимумом и его значением по умолчанию. В наши дни дефолт больше похож на 500, чем на пять, где он начался примерно в 1983 году. Вы не можете полагаться на то, что это то, что вы указали, и нет API для выяснения того, что это на самом деле, и нет очевидной причины для допустимого приложения, чтобы оно было короче, чем по умолчанию.