C# 套接字服务器没有更多的 800 个客户端

本文关键字:客户端 套接字 服务器 | 更新日期: 2023-09-27 18:37:05

我有 C# 套接字服务器。最大客户端数数与服务器连接的人数约为 800。如果客户端超过 800 个新客户端出现套接字错误 WSAECONNDENY 10061。Raizeup 最大客户端数如何?

接字之间的套接字写入。开始XXX和套接字。完三十。具体目标:框架4.0。协议: IP4, TCP

C# 套接字服务器没有更多的 800 个客户端

侦听器积压工作队列已满。当积压队列已满时,Windows 将开始向其他传入连接发送 RST,这些连接在相关客户端上变为"连接被拒绝"。您可以根据此处的其他答案提高积压队列长度,但这真正意味着您处理接受的速度不够快。仔细看看这样做的代码,并润滑路径。确保它不执行任何其他操作,例如阻止 I/O、磁盘 I/O、其他网络操作。接受连接后,它将脱离积压工作队列,以便其他传入连接可以成功。

将服务器套接字设置为其侦听状态时,可以设置积压工作。这是可以等待接受的最大连接数。

其他所有内容都可能是硬件问题 - 尝试在其他计算机上运行该程序。

下面是一个示例

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);
            }
        }

这样客户端连接计数没有 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");
                }
            }
        }

通过这种方式,客户端连接数超过 2000。阅读和写作我用BeginXXX和EndXXX做。