2012-06-13 93 views
5

我有C#套接字服務器。最大客戶端數量能夠與服務器連接的客戶端數量大約爲800.如果客戶端數量超過800,則新客戶端的套接字錯誤爲WSAECONNREFUSED 10061. raizeup max客戶端如何計數?C#套接字服務器沒有更多的800客戶端

套接字在socket.BeginXXX和socket.EndXXX之間寫入。目標:框架4.0。協議:IP4,TCP

+2

聽衆隊列的聲音已滿。你能粘貼一些代碼嗎? –

+0

路由器或防火牆也可以限制可用端口的範圍。 – Groo

+0

@Groo這裏只有一個端口用於服務器監聽的端口。 – EJP

回答

1

將serversocket設置爲偵聽狀態時,您可以設置積壓。這是可以等待接受的最大連接數。

其他一切都可能是硬件問題 - 嘗試在另一臺機器上運行該程序。

下面是一個

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

硬件問題如何?硬件如何導致TCP重置並拒絕連接? – EJP

+0

我正在考慮沿着網卡的線路。它的假設可能完全不相關。 – Johannes

3

偵聽積壓隊列已滿一個例子。當積壓隊列已滿時,Windows將開始向進一步的傳入連接發送RST,這會在相關客戶端上成爲「連接被拒絕」。您可以根據這裏的其他答案提高積壓隊列的長度,但是它的真正含義是您處理不夠快。仔細看看這樣做的代碼,併爲路徑加油。確保它不會做任何事情else,比如阻塞I/O,磁盤I/O,其他網絡操作。一旦連接被接受,它就會離開積壓隊列,這樣其他的連接就可以成功。

2

嗨,我找到我的問題的答案。我爲接受連接創建了額外的線程。例如:

上一頁

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。

+0

我很困惑,有人可以更多地瞭解這一點......如果我有一個循環創建1000個連接到監聽器......爲什麼我會得到「其他信息:由於目標機器主動拒絕,無法建立連接它「當有像MaxConnectoins = 2147483647積壓......我如何編碼監聽這個監聽器...即我怎麼知道什麼時候監聽器會拒絕連接... asuming它正在做什麼。錯誤代碼10061 plz help thx – Seabizkit

相關問題