Допустим, у меня есть 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 в реестре. - попытка запустить два сервера на разных интерфейсах (реальные интерфейсы и loopback) и использовать несколько клиентов.
Это известное ограничение в Windows или его можно как-то преодолеть?
Спасибо за помощь!