【问题标题】:C# Socket Server not have more 800 clientsC# Socket Server 没有更多的 800 个客户端
【发布时间】:2012-06-13 10:48:58
【问题描述】:

我有 C# 套接字服务器。最大客户端计数谁能够与服务器连接大约 800。如果客户端超过 800 个新客户端,则会收到套接字错误 WSAECONNREFUSED 10061。 raizeup max clients 如何计算?

socket.BeginXXX 和 socket.EndXXX 之间的套接字写入。目标:框架 4.0。协议:IP4、TCP

【问题讨论】:

  • 听上去好像监听队列满了。可以贴一些代码吗?
  • 路由器或防火墙也可以限制可用端口的范围。
  • @Groo 这里只有一个端口,服务器正在监听的端口。

标签: c# .net sockets networking


【解决方案1】:

侦听器积压队列已满。当积压队列已满时,Windows 将开始向进一步的传入连接发送 RST,这些连接在相关客户端上变为“连接被拒绝”。您可以根据此处的其他答案提高积压队列长度,但这真正意味着您处理接受的速度不够快。仔细查看执行此操作的代码,并为路径加油。确保它不做任何事情else,例如阻塞 I/O、磁盘 I/O、其他网络操作。一旦连接被接受,它就会从积压队列中消失,因此其他传入的连接可以成功。

【讨论】:

    【解决方案2】:

    将 serversocket 设置为监听状态时,您可以设置 backlog。这是可以等待接受的最大连接数。

    其他一切都可能是硬件问题 - 尝试在不同的机器上运行程序。

    这是一个例子

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

    【讨论】:

    • 硬件问题怎么办?硬件如何导致 TCP 重置和拒绝连接?
    • 我在考虑网卡。这是一个可能完全不相关的假设。
    【解决方案3】:

    嗨,我找到了我的问题的答案。我为接受连接创建了额外的线程。例如:

    上一个

    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。

    【讨论】:

    • 我很困惑,有人能否对此提供更多信息……如果我有一个循环创建 1000 个与听众的连接……为什么我会得到“附加信息:没有连接可能是因为目标机器主动拒绝它”当有像 MaxConnectoins = 2147483647 这样的积压...这就是它正在做的事情。错误代码10061 plz help thx
    猜你喜欢
    • 2021-10-28
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2011-09-22
    • 1970-01-01
    相关资源
    最近更新 更多