作者回复: 2是一个很好的例子。
作者回复: 👍
作者回复: 首先,客户端应用程序崩溃是可以有FIN包的,如果有的话,read阻塞就可以返回了;其次,如果真的是客户端机器跪了,那么是没有FIN包发出的,这个时候,我们只好一直在那里傻等。
且慢,还有别的辙,那就是不要用阻塞I/O,不要在哪里傻傻等待。使用I/O复用就可以办到的,往后看就会明白了。
作者回复: 当然有。服务器端要探活client来保证自己不会维护无效连接,客户端来探活保持自己是不是可以持续申请资源。
作者回复: 是这样的,
当客户端10秒钟select超时时间到达,第一次进入heartbeat,发送报文给服务器端,同时客户端把下一次select超时时间设置为3秒(KEEP_ALIVE_INTERVAL);
由于服务器端是5秒之后才回复,3秒之后,第二次heartbeat时间到,客户端发送第二个heartbeat。
5秒之后,第一次的heartbeat回复到,客户端把超时时间又重新设置为10秒。
再过5秒之后,第二次的heartbeat回复到,客户端把超时时间再次设置为10秒。
如此反复。
作者回复: 应该搞定了吧
作者回复: 是的,大部分的应用程序开发者都会选择自己在应用层处理连接有效性的检测。
作者回复: 学习了。
作者回复: 保活时间间隔就是每隔多长时间发送类似的ping消息。定时器是保活实现的一种常见形式。
作者回复: 基本是这样。而且应用层处理的时候,还有各种异常处理,便于暴露和发现问题,如果是使用tcp协议的keepalive,不是很容易处理这些细节。
作者回复: 哪里没看懂?
作者回复: 这种情况下确实不会傻等。
作者回复: 每秒一次会不会太快了?
作者回复: 这个是你工作中碰到过的,还是你自己构想出来的案例?
本质上,你问的问题是网络有延迟,导致检测时间也有延迟,我觉得这个是完全正常的,因为我们的程序是"企图"发现对端是否down掉了,是一个后知后觉型的,肯定是需要时间判断的。一般我们可以通过设置这个N的值来进行调整。比如N=3,三个包不回就认为down掉了。