【问题标题】:socket queue problem?套接字队列问题?
【发布时间】:2009-12-28 15:45:23
【问题描述】:

我是一名 dotnet 程序员。最近我编写了一个客户端服务器应用程序,它使用 system.net.sockets 进行连接并检查客户端是否打开,客户端发送 byte.minvalue 以检查是否存活。当客户端断开连接时,我关闭套接字并关闭它。这工作正常,但是当客户端数量增加时无法建立连接并出现问题。我使用 2000 值的积压但不能正常工作? 帮我!

【问题讨论】:

    标签: .net sockets


    【解决方案1】:

    这很模糊,一些更详细的信息(您在客户端和/或服务器上遇到的错误)或一些代码(您如何接受服务器上的连接?)可能会有所帮助。

    与此同时,我会随机猜测你......

    如果您正在快速创建和销毁来自客户端的连接,并且您正在通过在同一台机器上运行大量客户端来测试您的服务器,那么您可能会因为TIME_WAIT 而遇到套接字不足的问题。同样,如果您通过从同一台 Windows 计算机创建大量客户端连接(通常超过 4000 个)来测试服务器,那么您可能会遇到默认的 MAX_USER_PORT 设置,这严重限制了您可以进行的并发出站连接的数量一次。

    【讨论】:

      【解决方案2】:

      为什么在调用 OnClientAccept 时要锁定?这是一个瓶颈。

      如果您需要锁,请在 OnClientAccept 中进行更细粒度的操作。

      还有。切换到 BeginAccept/EndAccept 以提高速度。

      internal class SocketServer
      {
          private readonly IPAddress _address;
          private readonly int _port;
          private TcpListener _listener;
      
          public SocketServer(IPAddress address, int port)
          {
              _address = address;
              _port = port;
          }
      
          public void Start(int backlog)
          {
              if (_listener != null)
                  return;
      
              _listener = new TcpListener(_address, _port);
              _listener.Start(backlog);
              _listener.BeginAcceptSocket(OnAccept, null);
          }
      
          private void OnAccept(IAsyncResult ar)
          {
              TcpClient client = null;
              try
              {
                  client = _listener.EndAcceptTcpClient(ar);
              }
              catch(Exception err)
              {
                  // log here. Eat all exceptions so the server will not die.
                  // i usually have a ExceptionThrown event to let other code
                  // debug asynchrounous exceptions.
              }
      
              // Begin to accept clients asap
              try
              {
                  _listener.BeginAcceptTcpClient(OnAccept, null);
              }
              catch(Exception)
              {
                  // read above exception comment.
              }
      
      
              // this accept failed, lets not do anything with the client.
              if (client == null)
                  return;
      
              try
              {
                  OnClientAccepted(client);
              }
              catch(Exception)
              {
                  // read above exception comment.
              }
          }
      
          private void OnClientAccepted(TcpClient client)
          {
              throw new NotImplementedException();
          }
      
      
      }
      

      【讨论】:

        【解决方案3】:

        客户端连接/断开连接的速度有多快? TCP 套接字不会立即关闭,它们会进入 TIME_WAIT 状态并停留一段时间(我认为 Windows 上的默认值是 120 秒)。这可能会导致所有套接字都在使用中并且新连接被拒绝。

        此处为 MSDN 信息:http://msdn.microsoft.com/en-us/library/ms819739.aspx

        关于服务器类型:

        netstat -a
        

        如果您有大量 TIME_WAIT 连接,那么您需要减少关闭的套接字挂起的时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-15
          • 1970-01-01
          • 1970-01-01
          • 2017-04-15
          • 2021-10-01
          相关资源
          最近更新 更多