libevent2 http没有检测到客户端网络坏了

时间:2015-04-03 04:19:52

标签: libevent

我没有在这里粘贴源代码,如果有人想重现这个问题,请从this github project下载代码:

它是一个Comet服务器,服务器使用libevent-2.0.21-stable http。

重现问题:

  1. 从机器S
  2. 启动icomet-server
  3. 从另一台计算机C运行curl http://ip:8100/stream,服务器S将显示C已连接的消息
  4. 如果我按 CTRL + C 来终止curl,服务器就会知道C已按预期断开连接。
  5. 如果我从机器C(物理网络坏了)拔出网络线路,服务器将不知道C断开连接,它应该知道!
  6. 我会问一个熟悉libevent的人,如何让libevent 2来检测客户端网络?

1 个答案:

答案 0 :(得分:1)

当物理网络链接中断时,您不会总是收到数据包,告诉您丢失了连接。如果您想了解断开连接,请定期发送ping(请求无操作回复的请求),如果回复未在某个合理的超时内进行,则假设出现问题。或者只要他们闲置足够长时间就断开客户端。

当您执行Ctrl-C时,运行另一端的操作系统仍在运行,因此它能够生成TCP RST数据包以通知您的服务器客户端已经消失。但是当你打破那个物理链接时,客户端就再也无法发出那个呼救声了。还有其他东西要推断客户离开了。

现在,如果您尝试向客户端发送一些数据,服务器内核会(迟早)注意到客户端没有回复其消息。此时您将看到断开连接 - 但这可能需要几分钟才能实现。如果您发送任何数据,那么它将保持打开状态,直到您断开它,或者内核尝试TCP keepalive(内核的低级方式询问“嘿,我没有你有一段时间没有收到你的消息,你还在那里吗?“)可能在几个小时后(或者它根本不会为你做任何保持活动,具体取决于配置方式)。