backlog в listen()
От: nuklus  
Дата: 15.09.03 18:46
Оценка:
Привет

Интересует, как народ выбирает параметр 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 повысить, то ситуация улучшается, но хотелось бы что-то более определенное. Есть ли возможность узнать максимальную длину очереди отложенных подключений?
Re: backlog в listen()
От: NeuroVirus Россия  
Дата: 16.09.03 06:46
Оценка: 11 (1)
Здравствуйте, 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
провайдер должен выставить максимально возможное значение, практика показывает,
что это не так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.