此处不涉及编程语言
我在进行tcp开发时候,由于要保持连接,所以使用到了心跳包,但是经验浅,导致一开始的心跳包设置并不正确,记录下我对心跳包的理解:
1、导致连接中断的原因
当我们将连接建立起来后,如果网络异常中断,就会导致TCP连接显示ESTABLISHED状态,对于上层的应用来说,他认为这个连接是正常的,可以进行数据收发,但是实际上链路已不可达。
2、单纯的发送数据包,判断链路是否断掉
一开始,我在客户端不断发送数据包,但是问题很明了,那就是由于TCP的机制,系统的socket缓冲区会保存你要发送的数据,所以很顺利的数据包就发送出去了(其实只是拷贝到了系统缓冲区),但是对于上层应用来说,它会返回发送成功的标记。
3、所以当发送完数据包后要进行接收服务端的回复,并利用超时机制,判断链路是否正常,这个回复可以是只有一个字节的数据包,或者事先规定好的数据。
4、关于超时设置问题,不同的语言可能有不同的方法,对于linux下c可利用select函数,windows下同样也可以,我使用的是CSocket类,网上有写到用SetSockOpt方法,其实MSDN上有明确说明,该函数不能够设置SO_RCVTIMEO SO_SNDTIMEO等几个选项!
阅读(8898) | 评论(2) | 转发(0) |