整理自知乎,文/郭无心 游戏服务器常常有心跳包的设计。 我们的心跳包就是为了防止Socket断开连接,或是TCP的连接断开吗? 答案是否定的,TCP连接的通道是个虚拟的,连接的维持靠的是两端TCP软件对连接状态的维护。 TCP 连接自身有维护连接的机制,说白了就是自身有长时间没有数据包情况下的判断连接是否还存在的检测,清除死连接,即使在没有数据来往的时候,TCP也就可以(在启动TCP这个功能的前提下)自动发包检测是否连接正常,这个不需要我们处理。 服务端设计心跳包的目的: 探知对端应用是否存活,服务端客户端都可以发心跳包,一般都是客户端发送心跳包,服务端用于判断客户端是否在线,从而对服务端内存缓存数据进行清理(玩家下线等);问题在于,通过TCP四次握手断开的设定,我们也是可以通过Socket的read方法来判断TCP连接是否断开,从而做出相应的清理内存动作,那么为什么我们还需要使用客户端发送心跳包来判断呢? 第一种判断客户端是否在线策略: 直接监控TCP传输协议的返回值,通过返回值处理应用层的存活判断 比如在C 当中 使用poll的IO复用方法时: if(fds[i].revents |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|