sockets - 带有定期发送的套接字 Keepalive
问题描述
我有一个 C/C++ 应用程序设置如下:
- linux 平台上的非阻塞 TCP 服务器套接字
- 以 1 Hz 向套接字写入小数据包(小于 20 字节)的线程
- 套接字配置为
keepalive
启用并具有:keepidle
=5、keepintvl
=5 和keepcnt
=3
我的意图是该keepalive
机制应该检测网络链接的物理断开。但是,当链接被切断时,我看不到应该由keepalive
机制生成的零长度数据包(我正在使用 tcpdump 监控流量)。我的印象是,发生的事情是这样的:在电缆断开后,应用程序不断发出发送请求,并且有待处理的发送请求这一事实阻止了保活机制被激活。这个解释有效吗?
为了检查我的解释,我修改了我的测试如下:
- linux 平台上的非阻塞 TCP 服务器套接字
- 一个循环线程,它以 30 秒的周期向套接字写入一个小数据包(大约 100 字节)
- 套接字配置为
keepalive
启用并具有:keepidle
=5、keepintvl
=5 和keepcnt
=2
在这种情况下,如果我切断连接,keepalive 机制会在大约 15-20 秒内触发(这是我所期望的)。
在相关的一点上,我想了解tcp_keepidle
. 这被定义为:“在 TCP 开始发送保持活动探测之前,连接需要空闲的秒数”。在这种情况下,“空闲”到底是什么意思?是否只是意味着什么都没有收到,也没有任何东西放在网络上?或者这是否意味着没有收到任何内容并且没有向套接字发出发送请求?
解决方案
推荐阅读
- python - 将股票图像添加到自定义投影 matplotlib
- android - 表现形式合并失败,出现多个错误,请参阅日志
- r - r 中的 caret::train() 是否具有跨不同拟合方法/模型的标准化输出?
- git - Git - 在提交时查找文件名
- r - ggplot中的条形图-躲避位置+计数
- azure - 从 Azure 逻辑应用运行珍珠脚本
- verilog - 表达式宽度 32 与逻辑门阵列端口 1 的宽度 1 不匹配
- c++ - 当我使用客户端模拟器对其进行测试时,IOCP Socket Worker 线程的工作速度太慢了
- algorithm - 使用最速下降算法解决无约束优化问题
- sqlite - 是否有关于 GROUP BY 查询中的非聚合列的保证?