关于心跳包的问题,急!!!!!!!!!!!!!诚恳各位帮忙解答!!

时间:2022-10-13 19:31:32
现在我的任务是要做客户端的程序 功能是要给服务器端(第三方开发)定时发送心跳包
 本人由于初次接触网络编程 有已下困惑 恳请各位大侠 大虾 予以详细解释,讨论也好
    问题1:心跳包是用TCP协议发送好 还是UDP发送好 我在CSDN也看过不少帖子说用UDP发送,但是不明白这两个的异同 不同实现有什么优劣?
    问题2:如果是TCP来发心跳包的话 就免不了要调用CONNET函数来链接 那么这个CONNET函数 是不是当发送心跳包的定时器到了才调用呢 还是一开启客户端程序就一直在那不段的执行呢,最好这个地方能给个代码片段,看看怎么去调用这个CONNET。
    问题3:如果是TCP来发心跳包的话,当上述心跳包发送出去后 我怎么从客户端来判断该包已经被服务器接受到,有什么函数吗?判断心跳包是否被服务器接受到是不是也就实现了心跳包这一表明链接正常! 本人也看CSDN上关于这部分的内容 但都是从服务器端来判断客户端是否与之链接上 用的是什么时间机制 我现在的问题是怎么从客户端来判断  本人一直这么认为 是不是 有什么函数告诉已经发送成功 可不可以用SEND函数发送后返回的发送字节数来判断 如果发送字节数>0 就代表已经发过去了呢?还是和第三放事先商量好 当服务器(第三方开发)接受到心跳包的话 也给我回个什么样的确认包呢 

  感谢各位 写的稍微多点 麻烦大家能解答我的困惑!(PS:回答的好 我会多多加分的)

11 个解决方案

#1


问题4:上面忘说UDP的问题了 如果用UDP的话 具体有怎么实现呢 也是用什么函数来确定包已经发送过去了吗?那么请把这个函数告诉我 还是我发一个包 服务器给我回个确定接受到心跳包呢?? 这样又迂回验证是不是效率很低 

#2


 问题5: 又困惑了 如果用TCP方式传心跳包的话 传心跳包的目的是我们来确定网络是否链接好 那么CONNET函数没有这个功能吗?? 要知道我们的发心跳包是在CONNET函数调用成功后才能发出去的? 这个地方也是我很困惑的 CONNET的调用成功是否表明网络畅通啊?如果能的话 又需要心跳包来多次一举干什么用呢??????????


感谢各位帮忙看看

#3


1。这个服务器有关系的,server是tcp你就得使用tcp,server是udp你就得使用udp
2。连接一次就可以了,如果断开了等问题才需要再次连接
3。tcp判断是否发送成功就可以了
4。sendto

#4


楼上的说的没错
建议 楼主 看看 selcet 函数  

#5


麻烦3楼的能给下代码吗 怎么用TCP判断是否发送成功  你这说的有点笼统啊 兄弟我是初学者 请多多包涵 

#6


引用 5 楼 xiaofuchang 的回复:
麻烦3楼的能给下代码吗 怎么用TCP判断是否发送成功  你这说的有点笼统啊 兄弟我是初学者 请多多包涵


比如send函数的返回值,看到底发送了多少字节,是否和你要发送的相等,就这样判断

#7


也可以做异步心跳模式
A - B
A每隔10秒向B发送1个心跳包,只发送,不判断是否发送成功
B每隔10秒向A发送1个心跳包,也只管发送
A子线程收到B的心跳包,更新一下B节点的最新心跳时间
A每隔10秒检测一下B的最新心跳时间,如果长时间没有更新,则判断与B的连接已断开
反之B一样的逻辑


没必要使用Request-Response机制。

#8


心跳包的功能有好几种,楼主你要先确定你需要的是哪种的啊。
1、如果心跳包是用来检测跟服务器的当前业务连接是否断开的话(一般该连接采取TCP方式),那应该使用该连接发送心跳包,或者可以设置keepalivetime。
2、如果心跳包是用来检测跟服务器的网络连接是否可以通信的话(相当于ping),使用TCP或UDP都行,主要是实现问题。
一般的话应该是第一种的需求吧。
如果采用TCP定时发送心跳包的话,服务器端一段时间没收到该连接的心跳包就认为该连接已经断掉。

#9


最近两天比较忙 没上线 一上来就有这么多好心人给予指点 感谢楼上的各位!不过还是有一些问题 希望大家能再一起讨论下

       我曾问 怎么才能判断我SEND的数据是否发送成功,也就是确保我发的比如“abbbbbbcddd" 在服务器那面完全解析正确,而不是只收到部分? 这个问题也困扰了我 。在实际测试的时候 经常有时候 我发的数据到另一方只收到一部分。
     RAGELIU回答的是只要SEND的返回值与发送的字节数相等就行,但是这个似乎只适合阻塞模式吧??我查了下资料 在阻塞模式下SEND函数会一直把所以数据发送完再返回,RAGELIU好像似乎说的是这种情况;
     在非阻塞模式下只要调用后马上返回,SEND的字节数可能小于实际要发的总字节数
    我的问题是,也是我系统里的问题。在这种异步模式下我怎么确保我发的数据完全被对方接受了呢??强烈希望给个程序示意下
我自己试着写了一个楼上的几位看看对不(异步):
  sum=0;
  length=send(pbuf……);
  sum=sum+length;
  while(TotalBytes!=sum)
{  //不等说明这次返回的不等于应该发送的总体,继续循环
     length=send(pbuf+sum……);//指针移动的目的是定位到还没发送的部分
     if(length==socket_ERROR)
       { HANDLEERRO();
         break;
       }
     sum=length+sum;
}
其他部分

大家给点意见吧!嘿嘿
    

#10


TCP的3次握手细节保证数据的可靠到达
UDP情况下才会考虑这个问题

你所说的测试下对方只收到部分,我想是你对于recv的自维护缓冲没维护好,导致漏掉了一些数据吧

#11


我最近也在弄这个相关的东西,我想请教一下,在TCP模式下如果还采用心跳包的方式,会不会显得有点没有必要??不过通过keepalive来设置,好像如果设置不合理又会很容易导致连接丢失,请问各位大虾指点指点。。。。

#1


问题4:上面忘说UDP的问题了 如果用UDP的话 具体有怎么实现呢 也是用什么函数来确定包已经发送过去了吗?那么请把这个函数告诉我 还是我发一个包 服务器给我回个确定接受到心跳包呢?? 这样又迂回验证是不是效率很低 

#2


 问题5: 又困惑了 如果用TCP方式传心跳包的话 传心跳包的目的是我们来确定网络是否链接好 那么CONNET函数没有这个功能吗?? 要知道我们的发心跳包是在CONNET函数调用成功后才能发出去的? 这个地方也是我很困惑的 CONNET的调用成功是否表明网络畅通啊?如果能的话 又需要心跳包来多次一举干什么用呢??????????


感谢各位帮忙看看

#3


1。这个服务器有关系的,server是tcp你就得使用tcp,server是udp你就得使用udp
2。连接一次就可以了,如果断开了等问题才需要再次连接
3。tcp判断是否发送成功就可以了
4。sendto

#4


楼上的说的没错
建议 楼主 看看 selcet 函数  

#5


麻烦3楼的能给下代码吗 怎么用TCP判断是否发送成功  你这说的有点笼统啊 兄弟我是初学者 请多多包涵 

#6


引用 5 楼 xiaofuchang 的回复:
麻烦3楼的能给下代码吗 怎么用TCP判断是否发送成功  你这说的有点笼统啊 兄弟我是初学者 请多多包涵


比如send函数的返回值,看到底发送了多少字节,是否和你要发送的相等,就这样判断

#7


也可以做异步心跳模式
A - B
A每隔10秒向B发送1个心跳包,只发送,不判断是否发送成功
B每隔10秒向A发送1个心跳包,也只管发送
A子线程收到B的心跳包,更新一下B节点的最新心跳时间
A每隔10秒检测一下B的最新心跳时间,如果长时间没有更新,则判断与B的连接已断开
反之B一样的逻辑


没必要使用Request-Response机制。

#8


心跳包的功能有好几种,楼主你要先确定你需要的是哪种的啊。
1、如果心跳包是用来检测跟服务器的当前业务连接是否断开的话(一般该连接采取TCP方式),那应该使用该连接发送心跳包,或者可以设置keepalivetime。
2、如果心跳包是用来检测跟服务器的网络连接是否可以通信的话(相当于ping),使用TCP或UDP都行,主要是实现问题。
一般的话应该是第一种的需求吧。
如果采用TCP定时发送心跳包的话,服务器端一段时间没收到该连接的心跳包就认为该连接已经断掉。

#9


最近两天比较忙 没上线 一上来就有这么多好心人给予指点 感谢楼上的各位!不过还是有一些问题 希望大家能再一起讨论下

       我曾问 怎么才能判断我SEND的数据是否发送成功,也就是确保我发的比如“abbbbbbcddd" 在服务器那面完全解析正确,而不是只收到部分? 这个问题也困扰了我 。在实际测试的时候 经常有时候 我发的数据到另一方只收到一部分。
     RAGELIU回答的是只要SEND的返回值与发送的字节数相等就行,但是这个似乎只适合阻塞模式吧??我查了下资料 在阻塞模式下SEND函数会一直把所以数据发送完再返回,RAGELIU好像似乎说的是这种情况;
     在非阻塞模式下只要调用后马上返回,SEND的字节数可能小于实际要发的总字节数
    我的问题是,也是我系统里的问题。在这种异步模式下我怎么确保我发的数据完全被对方接受了呢??强烈希望给个程序示意下
我自己试着写了一个楼上的几位看看对不(异步):
  sum=0;
  length=send(pbuf……);
  sum=sum+length;
  while(TotalBytes!=sum)
{  //不等说明这次返回的不等于应该发送的总体,继续循环
     length=send(pbuf+sum……);//指针移动的目的是定位到还没发送的部分
     if(length==socket_ERROR)
       { HANDLEERRO();
         break;
       }
     sum=length+sum;
}
其他部分

大家给点意见吧!嘿嘿
    

#10


TCP的3次握手细节保证数据的可靠到达
UDP情况下才会考虑这个问题

你所说的测试下对方只收到部分,我想是你对于recv的自维护缓冲没维护好,导致漏掉了一些数据吧

#11


我最近也在弄这个相关的东西,我想请教一下,在TCP模式下如果还采用心跳包的方式,会不会显得有点没有必要??不过通过keepalive来设置,好像如果设置不合理又会很容易导致连接丢失,请问各位大虾指点指点。。。。