繁体   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