作者回复: 2是一个很好的例子。
作者回复: 👍
作者回复: 首先,客户端应用程序崩溃是可以有FIN包的,如果有的话,read阻塞就可以返回了;其次,如果真的是客户端机器跪了,那么是没有FIN包发出的,这个时候,我们只好一直在那里傻等。
且慢,还有别的辙,那就是不要用阻塞I/O,不要在哪里傻傻等待。使用I/O复用就可以办到的,往后看就会明白了。
作者回复: 保活时间间隔就是每隔多长时间发送类似的ping消息。定时器是保活实现的一种常见形式。
作者回复: 基本是这样。而且应用层处理的时候,还有各种异常处理,便于暴露和发现问题,如果是使用tcp协议的keepalive,不是很容易处理这些细节。
作者回复: 哪里没看懂?
作者回复: 这种情况下确实不会傻等。
作者回复: 每秒一次会不会太快了?
作者回复: 这个是你工作中碰到过的,还是你自己构想出来的案例?
本质上,你问的问题是网络有延迟,导致检测时间也有延迟,我觉得这个是完全正常的,因为我们的程序是"企图"发现对端是否down掉了,是一个后知后觉型的,肯定是需要时间判断的。一般我们可以通过设置这个N的值来进行调整。比如N=3,三个包不回就认为down掉了。
作者回复: 哈哈,9102年。
作者回复: 好吧,我应该加上你说的"点题"的。我在总结里加了一点。
作者回复: 我应该还把heatbeats置为0了。
作者回复: 探活包的多次发送,还是为了减少误判的概率,你说的是一种情况,但我觉得多此探活肯定会拉长对一个"无效"连接的判断时间的。这个是一个tradeoff,所以大多数程序都把这个作为选项让使用者自己配置。
作者回复: 这是因为,嗯,跟select实现有关,我再后面讲select时详细剖析,现在先记住吧。