当前位置:编程学习 > VB >>

关于winsock ,心跳包

vb 用winsock  ,客户端异常断开,杂判读,从网上查了半天,都在说心跳包,哪位大哥有 代码。或案例给小弟一下!谢谢
理论就不用说了,从网上查了好多。 --------------------编程问答-------------------- 没有代码,只有理论 --------------------编程问答-------------------- 小弟比较笨,看理论实栽是做出来啊!~~在网上又找不到案例! --------------------编程问答-------------------- 服务器定时发送,客户端应答 --------------------编程问答-------------------- 。。。给点代码? --------------------编程问答-------------------- 所谓心跳包,就是你自定义的一个协议,比如:服务器每1分钟给客户发送“嗯”,客户收到服务器的信息后回复“嗯哪”,这个就是心跳包。如果服务器发送了几个“嗯”,没有收到“嗯哪”表示客户机连接失败;相反也然。 --------------------编程问答--------------------
引用 5 楼 yiguangqiang88 的回复:
所谓心跳包,就是你自定义的一个协议,比如:服务器每1分钟给客户发送“嗯”,客户收到服务器的信息后回复“嗯哪”,这个就是心跳包。如果服务器发送了几个“嗯”,没有收到“嗯哪”表示客户机连接失败;相反也然。
嗯哪 --------------------编程问答-------------------- 各位老大是否能给个代码或以前的做过的案例,客户端和服务器端! 理论我从网上查过,知道是什么原理就是没有做出来,查了一星期了,实在是真的做不出来了,才来问的!谢谢各位老大,如果有代码的话联系我一下。 --------------------编程问答-------------------- 那是另一个问题,楼主应该毫不手软的结贴,慷慨激昂的给分 --------------------编程问答--------------------
引用 8 楼 yiguangqiang88 的回复:
那是另一个问题,楼主应该毫不手软的结贴,慷慨激昂的给分

我晕~~ --------------------编程问答-------------------- 已经知道用winsock,看看书,上上网,动动手 --------------------编程问答--------------------
引用 8 楼 yiguangqiang88 的回复:
那是另一个问题,楼主应该毫不手软的结贴,慷慨激昂的给分

正解 --------------------编程问答-------------------- LZ很简单的

服务器必须定时给客户端发送一个验证包(可以取名叫心跳包),看客户端是不是“死”了?  如果客户端有回应,那么就没死,有一次没回应,服务器脑袋上就应该冒汗了,后面连续发几次还没回应,服务器脑袋大汉, 这小客户肯定死翘翘了。。。

心跳包形式很多:

比如服务器定时发送,比如timer控件里头做也行
s.SendData "还有没有心跳"   '(这段验证代码必须保证在C端的解析和普通包严格区别,否则容易混淆)

客户端呢?对服务端的包都需要解析,如果发现有一个“还有没有心跳”的这个严重包包过来了,客户端必须做回应,比如“嗯”
c.GetData p
if 解析(p)="还有没有心跳" then
  c.SendData "嗯,我还没死!"
end if

这样服务器接到这个小客发来的"嗯,我还没死"说明这个小客没事, 否则就是死了, 比如断线了,小客肯定是哼不出声了撒。 

以上简单的说就是这样了。。希望楼主懂得! --------------------编程问答-------------------- 比如说客户端 在timer1 控件中 timer1 设成5秒发包
Private Sub Timer1_Timer()
发包!就直接发OK!
End Sub
服务器杂写?

我试着写的是
Private Sub server_DataArrival(index As Integer, ByVal bytesTotal As Long)
 Server(index).GetData strdata
    
   If strdata <> "OK" Then

     server(index).close
    
   End If
    
    
    
    For i = 0 To Server.Count - 1
          
        If Server(i).State = 7 Then
             Server(i).SendData strdata '分发数据
        
          
            DoEvents
         End If
    Next i


  Form1.Print "strData=" & strdata

end  sub 
这样不行啊,要整写才行? --------------------编程问答-------------------- '比如"isdie"为心跳包特征码,"y"为回复码, 服务端就是, 隔段时间发一次

Private Sub Timer1_Timer()
Server(指定的客户端索引).SendData "isdie"
End Sub

Private Sub server_DataArrival(index As Integer, ByVal bytesTotal As Long)
  Server(index).GetData strdata,vbString
  If strdata = "y" Then
     '没死
  End If
End Sub

'客户端那边做响应的代码
Private Sub c_DataArrival(index As Integer, ByVal bytesTotal As Long)
  c.GetData strdata,vbString
  If strdata = "isdie" Then
     '没死要回应
     c.SendData "y"
  End If
...
End Sub



大致就是这样子, 具体还要一些代码完善 --------------------编程问答-------------------- 别的都没问题,但是只是
Private Sub server_DataArrival(index As Integer, ByVal bytesTotal As Long)
  Server(index).GetData strdata,vbString
  If strdata = "y" Then
  '没死
  End If
End Sub
是不行的。和您说的一样。还得完善。主要是杂判断 延时了
这一块我不会啊 --------------------编程问答--------------------
引用 15 楼 ity521 的回复:
Private Sub server_DataArrival(index As Integer, ByVal bytesTotal As Long)
  Server(index).GetData strdata,vbString
  If strdata = "y" Then
  '没死
  End If
End Sub
是不行的。和您说的一样。还得完善。主要是杂判断 延时了


自己维护一个延时机制呀
服务器发生"死了没?"的时候记录时间。设置一个timer1,比如1分钟,
如果,1下来,客户端相应了"死了没?",返回了"没死",服务器端清除timer1,同时设置下一个询问时间计时timer2。。。
如果2,timer1在1分钟后timer到了吧,客户端死了 --------------------编程问答-------------------- 过来人的体会:说起来容易做起来难哪!

数据包里面混进心跳包咋办?
断开后间隔多长时间重连?
正重连时接到发送数据包请求咋办?
重连后要不要重发断开时未发的数据?
多少次重连以后放弃?
多少次重连时通知管理员?
…… --------------------编程问答-------------------- 严重支持楼上的说法,光说不练的,鄙视一个! --------------------编程问答-------------------- 第一个心跳包程序做不出来,怎么做更完善的程序。

LZ只想要程序,这程序做完善了怎么也有个几百行吧,你能理解多少? --------------------编程问答-------------------- 没接触过winsock,以后可能会接触,先了解下。

路过 --------------------编程问答--------------------
引用 17 楼 zhao4zhong1 的回复:
过来人的体会:说起来容易做起来难哪!

数据包里面混进心跳包咋办?
断开后间隔多长时间重连?
正重连时接到发送数据包请求咋办?
重连后要不要重发断开时未发的数据?
多少次重连以后放弃?
多少次重连时通知管理员?
……


弄个包头区别一下就是了
断开后,马上就可以重连啊.等什么
弄个缓冲就是了
要啊
我觉得这个判断时间间隔比较好.隔一段时间就自动重连
断开了立马通知就是了.这属于严重故障
---
每天回帖即可获得10分可用分! --------------------编程问答-------------------- 说说我的心跳包制作办法吧,纯属自己想的,不过很好用。

1、客户端每4秒给服务器发送一个当前时间
2、服务器建立连接后对客户端发来的时间进行存储
3、每10秒检测一下这个时间是否发生了变化,如果变了说明连着呢,没变的话就是断开了,那就关闭

我不知道这算不算心跳包,但这个办法确实非常好用。 --------------------编程问答-------------------- 楼主的心还跳吗 该结贴了 顺便给我加个30分哈哈哈. --------------------编程问答-------------------- 正在为这个问题纠结的顶一个 --------------------编程问答-------------------- 只为纠结,,,  --------------------编程问答-------------------- 心跳包最好使用带外数据来实现,具体思路可参见我写的一篇文章《使用“带外数据”实现TCP心跳包 》,上面有VB.NET的实现。 --------------------编程问答--------------------
引用 5 楼  的回复:
所谓心跳包,就是你自定义的一个协议,比如:服务器每1分钟给客户发送“嗯”,客户收到服务器的信息后回复“嗯哪”,这个就是心跳包。如果服务器发送了几个“嗯”,没有收到“嗯哪”表示客户机连接失败;相反也然。

+1
--------------------编程问答--------------------
引用 5 楼  的回复:
所谓心跳包,就是你自定义的一个协议,比如:服务器每1分钟给客户发送“嗯”,客户收到服务器的信息后回复“嗯哪”,这个就是心跳包。如果服务器发送了几个“嗯”,没有收到“嗯哪”表示客户机连接失败;相反也然。

这个交互设计不错嘛,跑起来之后就是:
嗯...嗯哪...嗯...嗯哪...啊(找不到了,哈哈哈) --------------------编程问答-------------------- 心跳包是这么个说法的吗?如果客户端不是你写的,能配合得了工作吗?
我实现的心跳包是通过tcp底层协议完成,不是应用层数据包,而是通过TCP会话状态包,socket API中有相关的选项设置,好好看winsocket相关API吧 --------------------编程问答-------------------- 如果是TCP连接,客户端断开了,那再发什么包都没用,应该要重新连接才行.TCP是由底层连接的.
如果是UDP连接,客户端是不是有响应,那要自己设置协议,定期发送信号,验证三次握手,确定可以传送包.
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,