Интересует, как народ выбирает параметр backlog для int listen( SOCKET s, int backlog /* maximum length of the queue of pending connections */).
Пишется высокопроизводительный сервер, способный принимать и поддерживать соединений, так много, насколько возможно.
Параметр по умолчанию SOMAXCONN (5) не устраивает, т.к. при некотором небольшом числе одновременно подключающихся клиентов, часть из них в connect() получает отказ WSAECONNREFUSED, если backlog повысить, то ситуация улучшается, но хотелось бы что-то более определенное. Есть ли возможность узнать максимальную длину очереди отложенных подключений?
Re: backlog в listen()
От:
Аноним
Дата:
16.09.03 06:40
Оценка:
"Есть ли возможность узнать максимальную длину очереди отложенных подключений?" Если не ошибаюсь, то нельзя. Попробуйте поставить просто очень большое число. Если оно превысит дозволенный лимит, то и Виндоус и Юникс поставят свое максимальное значение. У Стивенса все очень хорошо описано.
Здравствуйте, nuklus, Вы писали:
N>Привет
N>Интересует, как народ выбирает параметр backlog для int listen( SOCKET s, int backlog /* maximum length of the queue of pending connections */). N>Пишется высокопроизводительный сервер, способный принимать и поддерживать соединений, так много, насколько возможно. N>Параметр по умолчанию SOMAXCONN (5) не устраивает, т.к. при некотором небольшом числе одновременно подключающихся клиентов, часть из них в connect() получает отказ WSAECONNREFUSED, если backlog повысить, то ситуация улучшается, но хотелось бы что-то более определенное. Есть ли возможность узнать максимальную длину очереди отложенных подключений?
Здравствуйте, nuklus, Вы писали:
N>Привет
N>Интересует, как народ выбирает параметр backlog для int listen( SOCKET s, int backlog /* maximum length of the queue of pending connections */). N>Пишется высокопроизводительный сервер, способный принимать и поддерживать соединений, так много, насколько возможно. N>Параметр по умолчанию SOMAXCONN (5) не устраивает, т.к. при некотором небольшом числе одновременно подключающихся клиентов, часть из них в connect() получает отказ WSAECONNREFUSED, если backlog повысить, то ситуация улучшается, но хотелось бы что-то более определенное. Есть ли возможность узнать максимальную длину очереди отложенных подключений?
как пишет Майкрософт, нет способа узнать актуальное значение длины очереди.
Если поискать в MSDN то можно найти разные максимальные значения для
параметра BackLog (для Winsock 1.1 всегда равно SOMAXCONN = 5 для совместимости с Berkley Sockets)
Цитата:
The Windows Sockets 1.1 specification indicates that the maximum allowable value for backlog is 5; however,
Microsoft® Windows NT® version 3.51 accepts a backlog of up to 100,
Microsoft® Windows NT® 4.0 Server and Windows 2000 Server accepts a backlog of 200, and
Microsoft® Windows NT® 4.0 Workstation and Windows 2000 Professional accepts a backlog of 5 (which reduces the memory footprint).
В платформах типа Win95/98/ME тоже (скорее всего) равно 5.
Кроме того в серверных платформах можно сконфигурировать
динамический backlog для противодействиям атакам типа SYN FLOOD. (искать Q142641)
Для высокопроизводительных серверов необходимо устанавливать максимальное
значение параметра BackLog и очень быстро отрабатывать accept.
Также можно выполнять accept для одного слушающего сокета в нескольких потоках.
P.S. Хотя где-то в том-же MSDN написано что при получении параметра SOMAXCONN
провайдер должен выставить максимально возможное значение, практика показывает,
что это не так.