2015-02-20 2 views
2

select() может обрабатывать 64 сокета по умолчанию, я могу изменить этот предел, переопределив постоянную FD_SETSIZE во время компиляции. Но каково максимальное количество, которое может взять FD_SETSIZE?Какое максимальное количество сокетов, которые select() может обрабатывать в Windows?

Также должен ли я использовать select() под Windows или использовать WSAEventSelect()? (не уверен, что WSAEventSelect() допускает более 64 сокетов).

ответ

4

MSDN не определил верхний предел для FD_SETSIZE. Однако есть ряд факторов, влияющих на практический предел.

  1. Предел параллельного подключения (системный), который составляет около 1000 ~ 4000 на общей рабочей станции.

  2. Производительность. Windows select() реализована очень плохо, что вы должны рассмотреть возможность использования WSAAsyncSelect() и порт завершения для более чем тысяч сокетов.

+0

Что такое "Параллельное ограничение соединения"? Вы имеете в виду, что у меня может быть только 4000 подключенных сокетов за один раз! Также используется 'WSAAsyncSelect()' и IOCP, или я должен выбрать один из них? –

+0

Как правило, обычная Windows без серьезной настройки может обрабатывать только одно-несколько тысяч одновременных подключений за один раз и начать отказы подключения. –

+0

Так как я должен обрабатывать 8000 клиентских подключений ?! –

0
  1. Максимальное количество сокетов зависит от базового поставщика услуг WinSock (сам WinSock - это всего лишь оболочка интерфейса). См. https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169(v=vs.85).aspx

  2. WSAEventSelect() имеет некоторые дополнительные возможности над select(), но FD_SETSIZE обрабатывается обеими функциями одинаково.

+0

Если у вас есть ссылка на 2-ую претензию, пожалуйста, поделитесь ею. Благодаря! –

+0

'FD_SETSIZE' не обрабатывается [' WSAEventSelect() '] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms741576%28v=vs.85%29.aspx) в все. Этот API обрабатывает только один сокет, а не набор. – EJP

Смежные вопросы