私はC#ソケットサーバーを持っています。最大クライアント数は約800人のサーバーに接続できます。クライアントが800以上の新規クライアントでソケットエラーが発生した場合WSAECONNREFUSED 10061. 最大クライアント数はどのくらいですか?C#ソケットサーバーには800以上のクライアントがありません
socket.BeginXXXとsocket.EndXXXの間のソケット書き込み。ターゲット:フレームワーク4.0。プロトコル:IP4、TCP
私はC#ソケットサーバーを持っています。最大クライアント数は約800人のサーバーに接続できます。クライアントが800以上の新規クライアントでソケットエラーが発生した場合WSAECONNREFUSED 10061. 最大クライアント数はどのくらいですか?C#ソケットサーバーには800以上のクライアントがありません
socket.BeginXXXとsocket.EndXXXの間のソケット書き込み。ターゲット:フレームワーク4.0。プロトコル:IP4、TCP
serversocketをlisten状態に設定すると、バックログを設定できます。それは受け入れられるのを待つことができる接続の最大数です。
他のすべてがハードウェアの問題である可能性があります。プログラムを別のマシンで実行してみてください。ここで
は、リスナーのバックログキューがいっぱいになっている
Socket serversocket = ...
serversocket.Listen(1000);
の一例です。バックログキューがいっぱいになると、WindowsはRSTを今後の着信接続に送信し始めます。着信接続は、関係するクライアントで「接続が拒否されました」となります。ここでは、他の回答ごとにバックログのキュー長を上げることができますが、実際には処理が十分ではないということは、十分に速く受け入れることです。それを行うコードをよく見て、パスに油を注ぐ。 I/O、ディスクI/O、その他のネットワーク操作をブロックするなど、何もしないことを確認してください。接続が受け入れられると、それはバックログ待ち行列から外れ、他の着信接続が成功することができます。
こんにちは、私は私の質問に答えを見つける。私は受け入れ接続のための追加のスレッドを作成します。例えば: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を読んで書いています。
私はとても混乱しているので、誰かがこれをもっと光らせてくれます。リスナーに1000回の接続を作成するループがある場合はどうすればいいでしょうか?追加情報:ターゲットマシンが積極的に拒否したため接続できませんそれは、MaxConnectoins = 2147483647のようなバックログがある場合です...どのように私はリスナーでこれを監視するコード...どのように私は聴取者が接続を拒否するかを知っている...それは何をしているasuming。エラーコード10061 plz help thx – Seabizkit
リスナーキューのような音がいっぱいです。コードを貼り付けることはできますか? –
ルータまたはファイアウォールは、使用可能なポートの範囲を制限することもできます。 – Groo
@Grooここには、サーバーが待機しているポートが1つしかありません。 – EJP