局域网SOCKET通信(TCP)需要心跳包来保持长连接么?

Hello_Wrorld_2010 2011-03-03 11:09:23
RT,谢谢。。。
...全文
2084 27 打赏 收藏 举报
写回复
27 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Cxytz01 2012-12-03
  • 打赏
  • 举报
回复
引用 1 楼 arong1234 的回复:
心跳不是来保持连接的,而是来检测连接断没断的
这位哥说得没错, 可以参看这个帖子,我自己悟出来了。 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4056621&page=1&extra=#pid23712813
smwhotjay 2011-03-30
  • 打赏
  • 举报
回复
看需求了
jackson35296 2011-03-30
  • 打赏
  • 举报
回复
我从来不用心跳包,select就够了
yangyang_1980_ren 2011-03-29
  • 打赏
  • 举报
回复
保持连接不用心跳包吧?心跳包主要是查看对方是否在线的
西湖秀才 2011-03-29
  • 打赏
  • 举报
回复
可以用长连接的udp socket来检测tcp链路连接通不通
qman007 2011-03-14
  • 打赏
  • 举报
回复
如果没有心跳的话,时间长了就会产生“僵尸连接”,
就是通信的双方其实连接已经断了,但由于TCP并不
定时检测连接是否中断,而通信的双方又相互没有
send操作,导致该连接在通信的双方的tcp上一直有
效,占用操作系统资源。心跳就是通过定时send少量
数据,在高速LEN里仅根据其返回值就可以判断对等方
是否有效了,是很有必要的。

我几年前也是认为在高速LEN里没必要加上心跳,但在
不少实际项目中(电力公司局域网)确实出现了很多“僵尸连接”,
加上心跳后“僵尸连接”就几乎绝迹了。
精锐掷矛手 2011-03-14
  • 打赏
  • 举报
回复
看功能需求
MervynChina 2011-03-14
  • 打赏
  • 举报
回复
心跳包是应用层的应用,自己定义简单的协议包,占用的字节很少,可以尽量使资源充分利用,不出现死连接,监视连接状态,规范点,是要有心跳包的
请叫我涛哥0-0 2011-03-13
  • 打赏
  • 举报
回复
感觉12楼的说的很有道理,心跳包是给予应用连接的测试,不是基于网络连接的测试,当然应用程序连接失败后我们考虑是不是网络的原因,这要我们进一步来判断。
[Quote=引用 12 楼 ok1234567 的回复:]
网关是不是会强行断开连接?
不会

发送心跳包的话,也用这个sock111(Client端主动发)
需要明确:基于应用连接的测试,不是基于机器网络连接的测试,因此需要在一个确定的套接字上进行双向的连接检测(心跳包),各自维护好状态(通常为一个整形的时间戳,任何正常的通信都会更新该时间戳),心跳包只有在时间戳检测有疑问的时候才真正发送,达到一定的值才可判定断线
[/Quote]
xiayadong 2011-03-13
  • 打赏
  • 举报
回复
应该需要用心跳包来保持长连接的吧!!
我记得在一定时间内没有数据交接的话,网关会将连接重置的,这个时间长短不一定,一般好像在10分钟左右。具体多久好像跟只跟网关有关系。
xdw523570601 2011-03-09
  • 打赏
  • 举报
回复
问的有些问题,心跳可以实现这个功能
helloworld_2012 2011-03-08
  • 打赏
  • 举报
回复
用抓包工具可以看到,
服务器和客户端之间长时间不发包时,
会发送数据部分长度为0的数据包
不知道这个包是起什么作用的。
ok1234567 2011-03-08
  • 打赏
  • 举报
回复
网关是不是会强行断开连接?
不会

发送心跳包的话,也用这个sock111(Client端主动发)
需要明确:基于应用连接的测试,不是基于机器网络连接的测试,因此需要在一个确定的套接字上进行双向的连接检测(心跳包),各自维护好状态(通常为一个整形的时间戳,任何正常的通信都会更新该时间戳),心跳包只有在时间戳检测有疑问的时候才真正发送,达到一定的值才可判定断线

xtdga 2011-03-08
  • 打赏
  • 举报
回复
觉得没有必要,除非你需要非常及时的感知TCP连接中断!
Eleven 2011-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 oyljerry 的回复:]
心跳主要用来检测长连接状态下,网络是否异常断开,比如客户端异常死机等..
[/Quote]
同意~心跳包属于应用层协议,需自己定义协议格式
zyrr159487 2011-03-04
  • 打赏
  • 举报
回复
需要的吧,要不然断掉了都不知道
zyyoung 2011-03-04
  • 打赏
  • 举报
回复
套接字本身是有一套心跳保活机制的,不过默认的设置并不像我们一厢情愿的那样有效。在双方TCP套接字建立连接后(即都进入ESTABLISHED状态)并且在两个小时左右上层没有任何数据传输的情况下,这套机制才会被激活。

很多人认为两个小时的时间设置得很不合理。为什么不设置成为10分钟,或者更短的时间?(可以通过SO_KEEPALIVE选项设置。)但是这样做其实并不被推荐。实际上这套机制只是操作系统底层使用的一个被动机制,原理上不应该被上层应用层使用。当系统关闭一个由KEEPALIVE机制检查出来的死连接时,是不会主动通知上层应用的,只有在调用相应的IO操作在返回值中检查出来。

因此,忘记SO_KEEPALIVE,在应用层自己写一套保活机制比较靠谱。

oyljerry 2011-03-04
  • 打赏
  • 举报
回复
心跳主要用来检测长连接状态下,网络是否异常断开,比如客户端异常死机等..
傻X 2011-03-04
  • 打赏
  • 举报
回复
我觉得是需要的,长连接肯定需要对SOCKET保暖的.要不就用短连接,资源消耗比较大.

wutaihua 2011-03-04
  • 打赏
  • 举报
回复
是的 心跳包一般都比较小 发送的间隔比较长。
我们公司的心跳包 一般就16个字节 可以在定义结构体的时候 定义扩展模式。方便追加内容。发送的间隔为30秒一次。
如果中间发生了通讯。比如设备端发送了指令过来 或者我们发送成功指令给设备,则延后开始重新计时30秒。
加载更多回复(4)
发帖
网络编程

1.8w+

社区成员

VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
帖子事件
创建了帖子
2011-03-03 11:09
社区公告
暂无公告