TCP缓冲死锁,如何断开未接收数据的用户?

时间:2013-11-26 20:04:00

标签: c linux sockets tcp buffering

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

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

干杯

1 个答案:

答案 0 :(得分:0)

Beej's guide是对套接字的一个很好的引用。根据您的需要,如果进行errno之类的调用,则可以使用send(socket, buffer, buffer_length, MSG_DONTWAIT);的值并返回-1。值errno的{​​{1}}表示处理流量的缓冲区当前已满。

要问的一个问题是,你的客户是否真的是被填满的人。您的服务器缓冲区是否能够比您尝试编写的更快地清空?

@EJB有一个很好的观点,我的问题可能有点无意义,因为在大多数情况下,EAGAINerrno期间具有值EAGAIN的原因是客户端不是跟上转移的步伐。在这种情况下,您只需send并完成该特定客户端。如果你想要更高级的东西,你应该创建一些算法,它将使用一组启发式方法来确定这种客户端的状态,并相应地处理而不是简单地删除连接,除非那是你真正想要的。 / p>

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