问题是这样出现的,
操作:客户端正在向服务端请求数据的时候,突然拔掉客户端的网线。
现象:客户端死等,服务端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被封了