Допустим, у меня есть Windows 7 с одним реальным сетевым интерфейсом и несколькими интерфейсами обратной связи.У меня есть сервер с поддержкой IOCP, который принимает подключения от клиентов.Я пытаюсь смоделировать как можно больше реальных клиентских подключений к серверу.
Мой клиентский код просто устанавливает X количество соединений сокетов (обратите внимание, что клиент привязывается к данному интерфейсу):
const Int32 remotePort = 12345;
const Int32 MaxSockets = 60000;
Socket[] s = new Socket[MaxSockets];
IPEndPoint bindEndpoint = new IPEndPoint(IPAddress.Parse(args[0]), 0);
for (Int32 i = 0; i < MaxSockets; i++)
{
s[i] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s[i].SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
s[i].Bind(bindEndpoint);
s[i].Connect(args[1], remotePort);
IPEndPoint socketInfo = (IPEndPoint)s[i].LocalEndPoint;
Console.WriteLine(String.Format("Connected socket {0} {1} : {2}", i, socketInfo.Address, socketInfo.Port));
}
В петлевом интерфейсе у меня есть несколько IP-адресов, которые я использую для привязки.Кроме того, я также использую настоящий интерфейс для привязки.Я столкнулся с проблемой, когда количество открытых сокетов составляет около 64 КБ на машину:
Необработанное исключение: System.Net.Sockets.SocketException: Операция над сокетом не может быть выполнена, поскольку в системе недостаточнобуферного пространства или из-за переполнения очереди
Я пробовал несколько беспомощных вещей, таких как: - установка MaxUserPort на максимальное значение и некоторые другие рекомендуемые параметры TCPIP в реестре.- пытаться запустить два сервера на разных интерфейсах (реальные интерфейсы и шлейф) и использовать несколько клиентов.
Это известное ограничение в Windows или его можно как-то преодолеть?
Спасибо запомощь!