对于好多标准的库函数不会熟记于心真正在用到的时候才查看具体的作用和参数所代表的意思,对于setsockopt 在搜索的时候好多都是不负责任的转载 SOL_SOCKET SOL_TCP根本看不到 在这里介绍一下 TCP keep-live和send/recv 心跳检测
1:功能
TCP keep-live 和send/recv 心跳检测 作用一样都是为了保持活力,检测网络连接状态,
可能有些人要问为什么要保持活力,也许初始网络的人不是很了解,
->:很多防火墙等对于空闲socket自动关闭功能
->:对于服务器端来说,客户端的异常断开情况服务器是无法检测到的,只能通过心跳检测以便回收资源
2:差异
顾名思义keep-live 是TCP协议独有的一个功能,也就仅限于TCP,调用简单只需要调用如下函数,使用起来方便,只需要两次数据交互即可 另一端无需专门实现
int keepAlive = 1; // 开启keepalive属性. 缺省值: 0(关闭)
int keepIdle = 60; // 如果在60秒内没有任何数据交互,则进行探测. 缺省值:7200(s)
int keepInterval = 5; // 探测时发探测包的时间间隔为5秒. 缺省值:75(s)
int keepCount = 2; // 探测重试的次数. 全部超时则认定连接失效..缺省值:9(次)
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));
setsockopt(s, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(s, SOL_TCP, TCP_KEEPINTVL, (void*)&keepInterval, sizeof(keepInterval));
setsockopt(s, SOL_TCP, TCP_KEEPCNT, (void*)&keepCount, sizeof(keepCount));
send/recv 机制实现心跳则是在服务器和客户端的应用层根据个人喜好写的一份检测程序,灵活性高
能够知道对端断线或者是正常断开 有利于后续对断线类的单独处理(如游戏中 断线正常连上不扣积分,强制断开逃跑扣积分等等)