[英]C# Socket Server not have more 800 clients
我有C#套接字服務器。 最大客戶端數計算出能夠與服務器連接的人數約為800。如果客戶端數量超過800,則新客戶端會收到套接字錯誤WSAECONNREFUSED10061。raizeup最大客戶端數如何?
在socket.BeginXXX和socket.EndXXX之間進行套接字寫。 目標:框架4.0。 協議:IP4,TCP
偵聽器積壓隊列已滿。 當積壓隊列已滿時,Windows將開始向進一步的傳入連接發送RST,這些傳入連接在相關客戶端處變為“拒絕連接”。 您可以按照此處的其他答案提高待辦事項隊列的長度,但這實際上意味着您沒有足夠快速地處理接受問題。 仔細查看執行此操作的代碼,並添加路徑。 確保它不執行其他任何操作 ,例如阻止I / O,磁盤I / O,其他網絡操作。 接受連接后,它將退出積壓隊列,因此其他傳入連接可以成功。
將serversocket設置為偵聽狀態時,可以設置積壓。 那是可以等待被接受的最大連接數。
其他所有可能都是硬件問題-嘗試在其他計算機上運行該程序。
這是一個例子
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相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.