簡體   English   中英

C#套接字服務器沒有更多的800個客戶端

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM