Очередь прослушивания для многопоточного TCP-сервера - PullRequest
0 голосов
/ 25 марта 2011

Какое значение имеет очередь прослушивания (второй аргумент в вызове прослушивания) на многопоточном TCP-сервере?

Это немного сбивает с толку, потому что зачем нам очередь, когда у нас есть несколько потоков для обработкис разными клиентами?

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Из MSDN: http://msdn.microsoft.com/en-us/library/ms739168(v=vs.85).aspx

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

В Windows Sockets 2 это максимальное значение по умолчанию имеет большое значение (обычно несколько сотен или более).При вызове функции прослушивания в приложении Bluetooth настоятельно рекомендуется использовать гораздо меньшее значение для параметра backlog (обычно от 2 до 4), поскольку принимаются только несколько клиентских подключений.Это уменьшает системные ресурсы, которые выделяются для использования прослушивающим сокетом.Эта же рекомендация применяется к другим сетевым приложениям, которые ожидают только нескольких клиентских подключений.

Функция прослушивания обычно используется серверами, которые могут иметь более одного запроса на подключение одновременно.Если приходит запрос на подключение и очередь заполнена, клиент получит ошибку с указанием WSAECONNREFUSED.

Тот факт, что сервер TCP является многопоточным, не имеет значения, поскольку эта очередьвне пространства приложения, т.е. между ОС и приложением.

0 голосов
/ 27 марта 2011

Понять концепцию;рассмотрим следующий пример:

Вы знаете, что TCP выполняет трехстороннее рукопожатие для установления соединения.Когда удаленный клиент подключается к вашему TCP-серверу, он отправляет пакет SYN, и ваш сервер отвечает пакетом SYN-ACK, затем этот удаленный клиент снова отправляет пакет ACK, и затем соединение устанавливается.Таким образом, ваше приложение получает соединение, когда оно полностью установлено.Таким образом, пока ваше соединение не выполнено наполовину (я имею в виду, что вы получили SYN от удаленного клиента, отправили SYN-ACK и ожидаете последнего ACK), ваше приложение не примет соединение.Таким образом, может быть много удаленных клиентов, пытающихся подключиться к вашему серверу, и в вашей очереди прослушивания может быть много недоделанных соединений.

...