【发布时间】:2013-11-26 20:03:59
【问题描述】:
我有一台运行良好的服务器,除非我通过发送垃圾邮件数据包对其进行性能测试。客户端不接收数据只发送,然后服务器最终陷入死锁。
我如何检查最终用户是否没有接收数据并相应地断开它们是否会触发某种我可以解决的错误?
干杯
【问题讨论】:
标签: c linux sockets tcp buffering
我有一台运行良好的服务器,除非我通过发送垃圾邮件数据包对其进行性能测试。客户端不接收数据只发送,然后服务器最终陷入死锁。
我如何检查最终用户是否没有接收数据并相应地断开它们是否会触发某种我可以解决的错误?
干杯
【问题讨论】:
标签: c linux sockets tcp buffering
Beej's guide 是对套接字的一个很好的参考。根据您的需要,如果像 send(socket, buffer, buffer_length, MSG_DONTWAIT); 这样的调用被调用并返回 -1,您可以使用 errno 的值。 errno 的值为EAGAIN 表示处理输出流量的缓冲区当前已满。
要问的一个问题是,您的客户是否真的被填满了。您的服务器缓冲区是否无法比您尝试写入的速度更快地清空?
@EJB 有一个很好的观点,我的问题可能有点毫无意义,因为在大多数情况下,errno 在send 期间具有值EAGAIN 的原因是客户端没有跟上转移。在这种情况下,您只需 close(client_socket); 并完成与该特定客户端的操作。如果您想要更高级的东西,您应该创建某种算法,该算法将使用一组启发式方法来确定此类客户端的状态,并进行相应处理,而不是简单地断开连接,除非那是您真正想要的。
您可以使用的一个非常基本的启发式示例是给每个客户一个分配的时间,直到他们被认为没有响应。例如,如果您在接下来的 5-10 秒内一直在同一客户端上收到 EAGAIN,则该客户端可能被视为无响应,您可以关闭连接。
【讨论】: