用linux socket 的keepllive属性来检测网络连接的状态却发现编译时出现错误,TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT居然未定义。[喝小酒的网摘]http://blog.hehehehehe.cn/a/17673.htm
加上下面的头文件就可以了,其实TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT都是在tcp.h中定义的。
#include <sys/socket.h>
#include <netinet/in.h>#include <netinet/tcp.h>
tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
这三个状态的意思如下:
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
源码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。