这里我不粘贴的源代码,如果任何一个什么重现该问题,从this github project下载代码:libevent2 HTTP未检测客户端网络打破
这是一个彗星服务器,该服务器使用的libevent-2.0 .21稳定的http。
要重现该问题:
- 启动从机S的icomet服务器
- 从另一机器C运行
curl http://ip:8100/stream
,服务器S将表明,C已连接 - 消息,如果我按CTRL + C要终止curl,服务器知道C按预期断开连接。
- 如果我从机器C(物理网络断开)拔出网络线路,服务器将不知道C断开连接,它应该知道!
我会问一个熟悉libevent的人,如何让libevent 2检测到客户端网络坏了?
谢谢!您提到服务器是否向客户端发送了一些数据,它会发现客户端的断开连接 - “但这可能需要几分钟才能发生”。这是一个可接受的方法,我能够实现,但另一个问题 - 如何缩短时间(例如3秒)?有没有关于这个的libevent配置? – ideawu 2015-04-03 07:48:02
这是由TCP重新传输超时管理的,你不能真正缩短它,而不会使网络严重不可靠。使用这样的配置,多次重传将需要在3秒内发生,这可能会在丢包的网络上创建大量负载,因为它的负载过重。此外,几秒钟的网络丢失非常普遍(特别是对于移动设备),所以您可能不想反应如此迅速。 – bdonlan 2015-04-03 07:54:27