在很多网络应用程序,需要自定义心跳包来保持连接,不然断电或者非法关闭程序,对方识别不
到,需要进行超时检测,但是有些程序没有提供心跳协议,此时需要启用系统层的保活程序,此方
法适用于TCP连接。
int fd = tcpSocket->socketDescriptor();
int keepAlive = 1; int keepIdle = 5; int keepInterval = 2; int keepCount = 2; | //开启keepalive属性,缺省值:0(关闭) //如果在5秒内没有任何数据交互,则进行探测,缺省值:7200(s) //探测时发探测包的时间间隔为2秒,缺省值:75(s) //探测重试的次数,全部超时则认定连接失效,缺省值:9(次) |
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive,
sizeof(keepAlive));
setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval,
sizeof(keepInterval));
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
其他说明:
qt开发中非常不建议tr中包含中文,尽管现在的新版Qt支持中文到其他语言的翻译,但是很不规范,也不知道谁教的(后面发现我在刚学Qt的时候也发布了一些demo到网上也是tr包含中文的,当时就狠狠的打了自己一巴掌),tr的本意是包含英文,然后翻译到其他语言比如中文,现在大量的初学者滥用tr,如果没有翻译的需求,禁用tr,tr需要开销的,Qt默认会认为他需要翻译,会额外进行特殊处理。