1つの実際のネットワークインターフェイスといくつかのループバックインターフェイスを備えたWindows7があるとします。クライアントからの接続を受け入れる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がいくつかあります。さらに、実際のインターフェイスを使用してバインドします。開いているソケットの数がマシンあたり約64Kの場合、問題が発生しました。
未処理の例外:System.Net.Sockets.SocketException:システムに十分なバッファスペースがないか、キューがいっぱいであるため、ソケットでの操作を実行できませんでした
私は次のようないくつかの役に立たないことを試しました:-MaxUserPortを最大値に設定し、レジストリで他のいくつかの推奨されるTCPIP設定。-異なるインターフェイス(実際のインターフェイスとループバック)で2つのサーバーを実行しようとし、複数のクライアントを使用します。
それはWindowsの既知の制限ですか、それとも何らかの方法でそれを克服する可能性がありますか?
助けてくれてありがとう!