Каков верхний предел количества открытых сокетов в Windows Server 2003?

Я создаю чат-сервер с .NET. Я попытался открыть около 2000 клиентских подключений, и мой маршрутизатор Linksys WRT54GL (с микропрограммой томата) каждый раз зависает. То же самое происходит, когда у меня открыто несколько подключений на моем бит-торрент-клиенте Azureus.

У меня три вопроса:

  1. Есть ли ограничение на количество открытых сокетов в Windows Server 2003?
  2. Проблема в маршрутизаторе Linksys? Если да, то рекомендуется ли лучшее оборудование?
  3. Есть ли способ поделиться сокетами, чтобы я мог обрабатывать больше открытых клиентских подключений с меньшим количеством ресурсов?

Ответов (3)

Решение

Как я уже упоминал ранее, у Раймонда Чена есть хороший совет по такого рода вопросам: если вам нужно спросить об ограничениях ОС, вы, вероятно, делаете что-то не так. Протокол IP позволяет использовать максимум 65535 портов, и многие из них зарезервированы и недоступны для общего использования. Я бы посоветовал более подробно продумать ваши протоколы обмена сообщениями, чтобы ограничения ОС не были проблемой. Я уверен, что есть много хороших ресурсов, описывающих такие системы, и, безусловно, здесь есть люди, у которых есть хорошие идеи по этому поводу.

РЕДАКТИРОВАТЬ: я собираюсь высказать некоторые мысли о реализации масштабируемого сервера чата.

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

create message packet
open port to server
send packet
close port

Затем сервер выполняет следующие действия:

connection request received
get packet
close connection
process packet
for each client that requires updating
  open connection to clients
  send update packet
  close connection

Когда запускается новый сеанс чата, клиент, запускающий сеанс, отправляет на сервер сообщение «новый сеанс» с данными пользователя и IP-адресом клиента для ответов. Сервер создает новый сеанс чата и отвечает идентификатором сеанса. Затем клиент отправляет пакеты, содержащие сообщения, которые вводит пользователь, сервер обрабатывает их и пересылает сообщение другим клиентам в том же сеансе. Когда клиент покидает чат, он отправляет серверу сообщение о завершении сеанса. Сервер удаляет клиента из сеанса и уничтожает сеанс, когда в сеансе больше нет клиентов.

Надеюсь, это заставит вас задуматься.

i have found some answers to this that i feel i should share:

Сервер Windows 2003 имеет ограничение на количество используемых портов. но это можно настроить с помощью настройки реестра, чтобы изменить параметр MaxUSerPort с 5000 до 64 КБ (макс.).

Изучая дальше, я понимаю, что ограничение порта 64k на самом деле связано с IP-адресом, поэтому один сервер может легко получить гораздо больше портов и, следовательно, TCP-соединения, либо установив несколько сетевых карт, либо привязав более одного IP-адреса к сетевой карте. таким образом вы можете масштабировать свою систему для обработки портов nx 64k.

В течение нескольких дней была проблема с доступными сокетами на моей машине с Windows 7. Прочитав несколько статей об утечках сокетов в Win 7, я применил патч для Windows - ничего не изменилось.

Ниже приведена статья, подробно описывающая проблемы с подключением Windows: http://technet.microsoft.com/en-us/magazine/2007.12.network.aspx

У меня сработало следующее:

  1. Открыть Regedit
    • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Parameters: создайте TcpNumConnections, REG_DWORD, десятичное значение 500 (это может быть установлено в соответствии с вашими потребностями); EnableConnectionRateLimiting, REG_DWORD, значение 0;
    • HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip: создать MaxUserPort, REG_DWORD, десятичное значение 65534
  2. Перезагрузите Windows