【问题标题】:TCP buffering deadlock, how can i disconnect a user who isn't receiving data?TCP 缓冲死锁,如何断开未接收数据的用户?
【发布时间】:2013-11-26 20:03:59
【问题描述】:

我有一台运行良好的服务器,除非我通过发送垃圾邮件数据包对其进行性能测试。客户端不接收数据只发送,然后服务器最终陷入死锁。

我如何检查最终用户是否没有接收数据并相应地断开它们是否会触发某种我可以解决的错误?

干杯

【问题讨论】:

    标签: c linux sockets tcp buffering


    【解决方案1】:

    Beej's guide 是对套接字的一个很好的参考。根据您的需要,如果像 send(socket, buffer, buffer_length, MSG_DONTWAIT); 这样的调用被调用并返回 -1,您可以使用 errno 的值。 errno 的值为EAGAIN 表示处理输出流量的缓冲区当前已满。

    要问的一个问题是,您的客户是否真的被填满了。您的服务器缓冲区是否无法比您尝试写入的速度更快地清空?

    @EJB 有一个很好的观点,我的问题可能有点毫无意义,因为在大多数情况下,errnosend 期间具有值EAGAIN 的原因是客户端没有跟上转移。在这种情况下,您只需 close(client_socket); 并完成与该特定客户端的操作。如果您想要更高级的东西,您应该创建某种算法,该算法将使用一组启发式方法来确定此类客户端的状态,并进行相应处理,而不是简单地断开连接,除非那是您真正想要的。

    您可以使用的一个非常基本的启发式示例是给每个客户一个分配的时间,直到他们被认为没有响应。例如,如果您在接下来的 5-10 秒内一直在同一客​​户端上收到 EAGAIN,则该客户端可能被视为无响应,您可以关闭连接。

    【讨论】:

    • 你的问题毫无意义。服务器缓冲区只能以与客户端缓冲区相同的速率清空。
    • 不一定。涉及的变量很多,但我的问题可能比其他情况更不可能。
    • "客户端没有跟上传输" 所以关闭连接。这正是我想要做的:) 谢谢。我回家后会试试这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 2012-10-24
    • 2014-09-06
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多