私は C# で小さな Comet サーバーを作成しています。それをテストするために、一連の接続を開き、それぞれに小さなテキストを書き込み、それぞれを閉じる小さなプログラムを作成しました。
int basePort = 30000;
IPAddress localAddress = new IPAddress( new byte[] { 127, 0, 0, 1 } );
List<Socket> sockets = new List<Socket>();
for( int i = 0; i < 20000; i++ ) {
Socket s = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
s.Bind( new IPEndPoint( localAddress, basePort + i ) );
s.Connect( "localhost", 1999 );
sockets.Add( s );
}
string message = "hello";
byte[] messageData = Encoding.ASCII.GetBytes( message );
foreach( Socket s in sockets ) {
s.Send( messageData );
}
foreach( Socket s in sockets ) {
s.Disconnect( false );
}
現在、1025 から 5000 の範囲の動的クライアント ポートのみを割り当てる Windows XP を使用しているため、30000 から始まるポートへの明示的なバインディングを追加しました。 Socket.Connect で次の例外が発生します。
「システムに十分なバッファ領域がないか、キューがいっぱいだったため、ソケットに対する操作を実行できませんでした 127.0.0.1:1999」
何かご意見は?送信および受信バッファ サイズを変更しても違いはないようです。また、サーバーではなく常にクライアント アプリが壊れているようです。100,000 接続に到達する前にクライアント ポートが不足することはわかっていますが、何が起こっているのかをもう少しよく理解したいと思っています。