Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268006
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类:

2010-11-22 12:35:44

此处不涉及编程语言

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

mpandar2011-08-30 17:22:47

chinaunix网友: 服务器端的可以是一个字节,客户端的心跳包设计成什么形式?我对包的理解有些欠缺,希望能有些指导.....
这个可以是和其他请求命令相同的格式,标记为心跳包,也可以直接发一个字节,都无所谓了,关键是你的代码怎么处理!

chinaunix网友2011-08-04 16:24:53

服务器端的可以是一个字节,客户端的心跳包设计成什么形式?我对包的理解有些欠缺,希望能有些指导