我有一个C# socket服务器。最多能连接的客户端数量约为800个。如果客户端超过800个,新的客户端会收到套接字错误WSAECONNREFUSED 10061。
如何提高最大客户端连接数?
套接字写入在socket.BeginXXX和socket.EndXXX之间进行。目标:框架4.0。协议:IP4,TCP。
套接字写入在socket.BeginXXX和socket.EndXXX之间进行。目标:框架4.0。协议:IP4,TCP。
当将服务器套接字设置为监听状态时,可以设置backlog。这是等待被接受的最大连接数。
其他所有问题可能都是硬件问题 - 尝试在不同的机器上运行程序。
以下是一个示例:
Socket serversocket = ...
serversocket.Listen(1000);
嗨,我找到了我的问题的答案。我创建了一个额外的线程来接受连接。例如:
原来的代码:
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);
}
}
通过这种方式,客户端连接数不会超过800。
目前我写的是:
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");
}
}
}
通过这种方式,客户端连接数超过了2000。我使用BeginXXX和EndXXX进行读写操作。