我没有在这里粘贴源代码,如果有人想重现这个问题,请从this github project下载代码:
它是一个Comet服务器,服务器使用libevent-2.0.21-stable http。
重现问题:
curl http://ip:8100/stream
,服务器S将显示C已连接的消息我会问一个熟悉libevent的人,如何让libevent 2来检测客户端网络?
答案 0 :(得分:1)
当物理网络链接中断时,您不会总是收到数据包,告诉您丢失了连接。如果您想了解断开连接,请定期发送ping(请求无操作回复的请求),如果回复未在某个合理的超时内进行,则假设出现问题。或者只要他们闲置足够长时间就断开客户端。
当您执行Ctrl-C时,运行另一端的操作系统仍在运行,因此它能够生成TCP RST数据包以通知您的服务器客户端已经消失。但是当你打破那个物理链接时,客户端就再也无法发出那个呼救声了。还有其他东西要推断客户离开了。
现在,如果您尝试向客户端发送一些数据,服务器内核会(迟早)注意到客户端没有回复其消息。此时您将看到断开连接 - 但这可能需要几分钟才能实现。如果您不发送任何数据,那么它将保持打开状态,直到您断开它,或者内核尝试TCP keepalive(内核的低级方式询问“嘿,我没有你有一段时间没有收到你的消息,你还在那里吗?“)可能在几个小时后(或者它根本不会为你做任何保持活动,具体取决于配置方式)。