发明名称 一种发送心跳包维持长连接的方法
摘要 一种发送心跳包维持长连接的方法,包括:打开keepAlive开关,设置keepAlive参数,客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keep‑alive packet,根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程。本发明通过调整TCP的keepAlive参数来实现,用TCP协议的keepAlive选项是TCP协议本身的功能,属于传输层,服务器收到客户端发过来的keepAlive探测包时在传输层就可以回复客户端,并不会再向上层提交,所以效率高很多。
申请公布号 CN103716323B 申请公布日期 2016.11.30
申请号 CN201310747400.4 申请日期 2013.12.31
申请人 厦门悦讯信息科技有限公司 发明人 严伯盛;林飞达;黄礼锋
分类号 H04L29/06(2006.01)I 主分类号 H04L29/06(2006.01)I
代理机构 厦门市新华专利商标代理有限公司 35203 代理人 朱凌
主权项 一种发送心跳包维持长连接的方法,其特征在于:包括如下步骤:步骤一:打开keepAlive开关,设置keepAlive参数,具体包括:客户端:步骤A1:建立TCP Socket客户端;步骤A2:打开SO_KEEPALIVE选项;步骤A3:设置TCP_KEEPIDLE 为心跳包间隔周期;步骤A4:设置TCP_KEEPINTVL为s秒;步骤A5:设置TCP_KEEPCNT为n次;步骤A6:开始阻塞式读写;服务端:步骤B1:建立TCP Socket服务端;步骤B2:选用异步非阻塞读写;步骤B3:处理正常业务逻辑,不处理心跳包代码;步骤二:客户端TCP的保活计时器开始工作,如果在保活计时器到期之前没有发生有效数据传输,工作在系统的内核空间的客户端TCP协议栈自动向服务端发起一个keepAlive探测包,该 keepAlive探测包就是 ACK 和当前TCP 序列号减一的组合,此时根据网络的不同情况,会出现正常情况、网络异常或服务端异常、服务端曾经中断后重启三种处理流程:如果是正常情况,转入步骤C1:步骤C1:客户端向服务端发起keepAlive 探测包;步骤C2:服务端收到keepAlive 探测包;步骤C3:服务端发出ACK回复包;步骤C4:客户端收到ACK回复包;步骤C5:客户端保活计时器重新开始计时,进入下一次循环;如果是网络异常,或服务端异常,转入步骤D1:步骤D1:客户端向服务端发起keepAlive 探测包;步骤D2:经过TCP_KEEPINTVL设定的时间后客户端未收到回复,再次发出keepAlive 探测包,重复TCP_KEEPCNT设定的次数;步骤D3:客户端一直未收到ACK回复包,引起 Socket _ERROR;步骤D4:内核空间向用户空间提交 Socket _ERROR;步骤D5:用户空间应用程序检测到Socket _ERROR, recv 函数返回 Socket _ERROR,WSAGetLastError()得到的结果为WSAECONNRESET(10054) ,重新建立新Socket与服务端连接;如果是服务端曾经中断后重启,转入步骤E1:步骤E1:客户端向服务端发起keepAlive 探测包;步骤E2:服务端收到keepAlive 探测包;步骤E3:服务端发出RST标志复位回复包;步骤E4:客户端收到RST标志复位回复包 ;步骤E5:客户端发起SocketException:远程主机强迫关闭了一个现有的连接错语,关闭当前Socket;步骤E6:客户端内核空间向用户空间的用户程序提交SocketException;步骤E7:用户空间应用程序检测到SocketException ,重新建立新的Socket与服务端连接。
地址 361000 福建省厦门市思明区龙虎山路555号250室