6

私は 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 接続に到達する前にクライアント ポートが不足することはわかっていますが、何が起こっているのかをもう少しよく理解したいと思っています。

4

3 に答える 3

3

非ページ メモリが不足している可能性があります。インストールされている RAM、OS、/3GB スイッチの設定などに基づいて、マシンごとおよびプロセスごとの制限があります。32 ビット OS sku の非ページ メモリの制限は、64 ビット OS sku よりもはるかに低くなります。

于 2009-05-25T14:21:48.593 に答える
3

100.000 接続は実行可能な目標ではないと思います。

TCP/IP ポートは 16 ビットの数字です。したがって、65535 を超えるものはいずれにせよダメです。

于 2009-05-25T14:36:47.877 に答える
1

Windows XP (およびおそらくその他のバージョン) では、一度に開くことができるポートの数に制限があります。このMSDNの記事は、TcpIp パラメータを変更して、利用可能なポートの数を増やし、再利用が許可されるまで Windows がポートを開いたままにする時間を減らすのに役立つ場合があります。

于 2009-05-25T14:12:42.667 に答える