利用keepalive和timeout来判断死连接

当遇到客户端向服务端请求数据时突然断网导致的死锁问题,设置TCP保活(keepalive)属性无法解决服务端的等待状态。文章介绍了TCP_USER_TIMEOUT选项,该选项在Linux 2.6.37及以上内核中可用,允许自定义最大等待无响应数据的时间,从而能有效关闭因保活失败的连接。通过在服务端设置TCP_USER_TIMEOUT,问题得到解决。同时,文章讨论了TCP保活与超时重传机制在判断对端存活和处理异常连接中的作用。
摘要由CSDN通过智能技术生成

问题是这样出现的,

       操作:客户端正在向服务端请求数据的时候,突然拔掉客户端的网线。

       现象:客户端死等,服务端socket一直存在。

 

在网上搜索后,需要设置KEEPALIVE属性。

于是就在客户端和服务端都设置了KEEPALIVE属性。

 

代码如下:

int keepalive = 1;  // 打开keepalive

int keepidle = 10;  // 空闲10s开始发送检测包(系统默认2小时)

int keepinterval = 1;  // 发送检测包间隔 (系统默认75s)

int keepcount = 5;  // 发送次数如果5次都没有回应,就认定peer端断开了。(系统默认9次)

setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE,&keepalive, sizeof(keepalive));

setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE,&keepidle, sizeof(keepidle));

setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL,&keepinterval, sizeof(keepinterval));

setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT,&keepcount, sizeof(keepcount));

这样的情况下,客户端没有问题了,可以主动关闭,但是服务端还是在死等,也就是说keepalive没起作用。

其实我也没有查到原因,插一句题外话,百度搜索真是不好用(偏偏google被封了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值