【问题标题】:What happens to not accepted connection?不接受的连接会发生什么?
【发布时间】:2009-01-22 00:00:57
【问题描述】:

假设 localhost:80 上有一个监听套接字,并且客户端使用以下方式连接:telnet localhost 80

问题是我只想接受有限数量的并发客户端,假设只有一个。 在那之后,我根本不接受。

我看到的问题是:netstat -a 是建立了下一个客户端连接。是的,我不处理它,但是在系统级别上它显示为 ESTABLISHED,客户端可以发送数据并可能给系统带来额外的开销。

我看到的唯一方法是继续接受客户端但断开它们。 我对吗?

【问题讨论】:

    标签: sockets networking network-programming


    【解决方案1】:

    listen() 函数有一个backlog 参数,该参数指定允许在操作系统内核中等待服务器到accept() 它们的未完成套接字的数量。

    在我的 Linux 系统上,listen() 的手册页说大多数情况下客户端会收到 connection refused 错误 - 就像套接字根本没有监听一样。

    如果您只想处理一个连接,那很好,您可以这样做:

    listen(s, 0);
    while ((new_fd = accept(s)) >= 0) {
        process(new_fd);
    }
    

    如果你想处理多个,这会有点困难。您不能只将backlog 参数设置为并发连接数,因为该参数没有考虑有多少连接已经处于活动状态。

    【讨论】:

      【解决方案2】:

      如果您停止侦听该端口,则不应再允许任何传入连接。确保侦听器在接受第一个连接后关闭。

      另外两个选项:

      使用原始套接字(如果您的操作系统支持它们)。并手动处理 TCP 连接。不过,这将涉及大量额外的代码和处理。

      使用 UDP。它们是无状态连接,但是您将不得不根据其他内容接受/拒绝数据包。不过,这没有 TCP 连接的开销。此外,您将无法使用 telnet 之类的东西进行测试。

      【讨论】:

      • 可以,但是会影响性能,因为每次并发客户端数量超过阈值时,我们都会开始/停止侦听。
      【解决方案3】:

      当您不再希望接受更多连接时,您应该简单地关闭侦听套接字,并在您确实希望接受连接时再次打开它。侦听积压对您根本没有帮助,因为它只是用于 TCP/IP 堆栈已接受但应用程序尚未接受的“半开”连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 2012-04-17
        • 2020-10-14
        相关资源
        最近更新 更多