2012-06-13 16 views
5

私はC#ソケットサーバーを持っています。最大クライアント数は約800人のサーバーに接続できます。クライアントが800以上の新規クライアントでソケットエラーが発生した場合WSAECONNREFUSED 10061. 最大クライアント数はどのくらいですか?C#ソケットサーバーには800以上のクライアントがありません

socket.BeginXXXとsocket.EndXXXの間のソケット書き込み。ターゲット:フレームワーク4.0。プロトコル:IP4、TCP

+2

リスナーキューのような音がいっぱいです。コードを貼り付けることはできますか? –

+0

ルータまたはファイアウォールは、使用可能なポートの範囲を制限することもできます。 – Groo

+0

@Grooここには、サーバーが待機しているポートが1つしかありません。 – EJP

答えて

1

serversocketをlisten状態に設定すると、バックログを設定できます。それは受け入れられるのを待つことができる接続の最大数です。

他のすべてがハードウェアの問題である可能性があります。プログラムを別のマシンで実行してみてください。ここで

は、リスナーのバックログキューがいっぱいになっている

Socket serversocket = ... 
serversocket.Listen(1000); 
+0

ハードウェアの問題?ハードウェアがTCPをリセットして接続を拒否する方法を教えてください。 – EJP

+0

私はネットワークカードのラインに沿って考えていました。それは完全に無関係かもしれない仮説です。 – Johannes

3

の一例です。バックログキューがいっぱいになると、WindowsはRSTを今後の着信接続に送信し始めます。着信接続は、関係するクライアントで「接続が拒否されました」となります。ここでは、他の回答ごとにバックログのキュー長を上げることができますが、実際には処理が十分ではないということは、十分に速く受け入れることです。それを行うコードをよく見て、パスに油を注ぐ。 I/O、ディスクI/O、その他のネットワーク操作をブロックするなど、何もしないことを確認してください。接続が受け入れられると、それはバックログ待ち行列から外れ、他の着信接続が成功することができます。

2

こんにちは、私は私の質問に答えを見つける。私は受け入れ接続のための追加のスレッドを作成します。例えば:2000以上のこのようクライアント接続数raizeによって

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

acceptThread = new Thread(new ThreadStart(ExecuteAccept)); 
acceptThread.Start(); 

...... 

private void ExecuteAccept() 
     { 

      while (true) 
      { 

       ConnectionInfo connection = new ConnectionInfo(); 
       try 
       { 
        connection.Socket = _serverSocket.Accept(); 

        connection.Buffer = new byte[1024]; 
        connection.Socket.BeginReceive(connection.Buffer, 0, connection.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), connection); 
       } 
       catch (SocketException exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
       catch (Exception exc) 
       { 
        CloseConnection(connection, "Exception in Accept"); 
       } 
      } 
     } 

:この方法でクライアント接続によって

IPEndPoint myEndpoint = new IPEndPoint(IPAddress.Parse(_serverAddress), _port); 
_serverSocket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

_serverSocket.Bind(myEndpoint); 
_serverSocket.Listen((int)SocketOptionName.MaxConnections); 

_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 

..... 


private void AcceptCallback(IAsyncResult result) 
     { 
      ConnectionInfo connection = new ConnectionInfo(); 
      try 
      { 
       Socket s = (Socket)result.AsyncState; 
       connection.Socket = s.EndAccept(result); 

       connection.Buffer = new byte[1024]; 
       connection.Socket.BeginReceive(connection.Buffer, 
        0, connection.Buffer.Length, SocketFlags.None, 
        new AsyncCallback(ReceiveCallback), 
        connection); 
      } 
      catch (SocketException exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      catch (Exception exc) 
      { 
       CloseConnection(connection, "Exception in Accept"); 
      } 
      finally 
      { 

        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), result.AsyncState); 
      } 
     } 

を一切raize 800

を数えていない現在、私はこれを書きます。私はBeginXXXとEndXXXを読んで書いています。

+0

私はとても混乱しているので、誰かがこれをもっと光らせてくれます。リスナーに1000回の接続を作成するループがある場合はどうすればいいでしょうか?追加情報:ターゲットマシンが積極的に拒否したため接続できませんそれは、MaxConnectoins = 2147483647のようなバックログがある場合です...どのように私はリスナーでこれを監視するコード...どのように私は聴取者が接続を拒否するかを知っている...それは何をしているasuming。エラーコード10061 plz help thx – Seabizkit

関連する問題