我有C#套接字服務器。最大客戶端數量能夠與服務器連接的客戶端數量大約爲800.如果客戶端數量超過800,則新客戶端的套接字錯誤爲WSAECONNREFUSED 10061. raizeup max客戶端如何計數?C#套接字服務器沒有更多的800客戶端
套接字在socket.BeginXXX和socket.EndXXX之間寫入。目標:框架4.0。協議:IP4,TCP
我有C#套接字服務器。最大客戶端數量能夠與服務器連接的客戶端數量大約爲800.如果客戶端數量超過800,則新客戶端的套接字錯誤爲WSAECONNREFUSED 10061. raizeup max客戶端如何計數?C#套接字服務器沒有更多的800客戶端
套接字在socket.BeginXXX和socket.EndXXX之間寫入。目標:框架4.0。協議:IP4,TCP
偵聽積壓隊列已滿一個例子。當積壓隊列已滿時,Windows將開始向進一步的傳入連接發送RST,這會在相關客戶端上成爲「連接被拒絕」。您可以根據這裏的其他答案提高積壓隊列的長度,但是它的真正含義是您處理不夠快。仔細看看這樣做的代碼,併爲路徑加油。確保它不會做任何事情else,比如阻塞I/O,磁盤I/O,其他網絡操作。一旦連接被接受,它就會離開積壓隊列,這樣其他的連接就可以成功。
嗨,我找到我的問題的答案。我爲接受連接創建了額外的線程。例如:
上一頁
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
目前,我寫這篇文章:
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");
}
}
}
通過這種方式的客戶端連接數raize超過2000。閱讀和寫我與BeginXXX和EndXXX。
我很困惑,有人可以更多地瞭解這一點......如果我有一個循環創建1000個連接到監聽器......爲什麼我會得到「其他信息:由於目標機器主動拒絕,無法建立連接它「當有像MaxConnectoins = 2147483647積壓......我如何編碼監聽這個監聽器...即我怎麼知道什麼時候監聽器會拒絕連接... asuming它正在做什麼。錯誤代碼10061 plz help thx – Seabizkit
聽衆隊列的聲音已滿。你能粘貼一些代碼嗎? –
路由器或防火牆也可以限制可用端口的範圍。 – Groo
@Groo這裏只有一個端口用於服務器監聽的端口。 – EJP