关于winsock ,心跳包
vb 用winsock ,客户端异常断开,杂判读,从网上查了半天,都在说心跳包,哪位大哥有 代码。或案例给小弟一下!谢谢理论就不用说了,从网上查了好多。 --------------------编程问答-------------------- 没有代码,只有理论 --------------------编程问答-------------------- 小弟比较笨,看理论实栽是做出来啊!~~在网上又找不到案例! --------------------编程问答-------------------- 服务器定时发送,客户端应答 --------------------编程问答-------------------- 。。。给点代码? --------------------编程问答-------------------- 所谓心跳包,就是你自定义的一个协议,比如:服务器每1分钟给客户发送“嗯”,客户收到服务器的信息后回复“嗯哪”,这个就是心跳包。如果服务器发送了几个“嗯”,没有收到“嗯哪”表示客户机连接失败;相反也然。 --------------------编程问答-------------------- 嗯哪 --------------------编程问答-------------------- 各位老大是否能给个代码或以前的做过的案例,客户端和服务器端! 理论我从网上查过,知道是什么原理就是没有做出来,查了一星期了,实在是真的做不出来了,才来问的!谢谢各位老大,如果有代码的话联系我一下。 --------------------编程问答-------------------- 那是另一个问题,楼主应该毫不手软的结贴,慷慨激昂的给分 --------------------编程问答--------------------
我晕~~ --------------------编程问答-------------------- 已经知道用winsock,看看书,上上网,动动手 --------------------编程问答--------------------
正解 --------------------编程问答-------------------- 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
是不行的。和您说的一样。还得完善。主要是杂判断 延时了
这一块我不会啊 --------------------编程问答--------------------
自己维护一个延时机制呀
服务器发生"死了没?"的时候记录时间。设置一个timer1,比如1分钟,
如果,1下来,客户端相应了"死了没?",返回了"没死",服务器端清除timer1,同时设置下一个询问时间计时timer2。。。
如果2,timer1在1分钟后timer到了吧,客户端死了 --------------------编程问答-------------------- 过来人的体会:说起来容易做起来难哪!
数据包里面混进心跳包咋办?
断开后间隔多长时间重连?
正重连时接到发送数据包请求咋办?
重连后要不要重发断开时未发的数据?
多少次重连以后放弃?
多少次重连时通知管理员?
…… --------------------编程问答-------------------- 严重支持楼上的说法,光说不练的,鄙视一个! --------------------编程问答-------------------- 第一个心跳包程序做不出来,怎么做更完善的程序。
LZ只想要程序,这程序做完善了怎么也有个几百行吧,你能理解多少? --------------------编程问答-------------------- 没接触过winsock,以后可能会接触,先了解下。
路过 --------------------编程问答--------------------
弄个包头区别一下就是了
断开后,马上就可以重连啊.等什么
弄个缓冲就是了
要啊
我觉得这个判断时间间隔比较好.隔一段时间就自动重连
断开了立马通知就是了.这属于严重故障
---
每天回帖即可获得10分可用分! --------------------编程问答-------------------- 说说我的心跳包制作办法吧,纯属自己想的,不过很好用。
1、客户端每4秒给服务器发送一个当前时间
2、服务器建立连接后对客户端发来的时间进行存储
3、每10秒检测一下这个时间是否发生了变化,如果变了说明连着呢,没变的话就是断开了,那就关闭
我不知道这算不算心跳包,但这个办法确实非常好用。 --------------------编程问答-------------------- 楼主的心还跳吗 该结贴了 顺便给我加个30分哈哈哈. --------------------编程问答-------------------- 正在为这个问题纠结的顶一个 --------------------编程问答-------------------- 只为纠结,,, --------------------编程问答-------------------- 心跳包最好使用带外数据来实现,具体思路可参见我写的一篇文章《使用“带外数据”实现TCP心跳包 》,上面有VB.NET的实现。 --------------------编程问答--------------------
+1
--------------------编程问答--------------------
这个交互设计不错嘛,跑起来之后就是:
嗯...嗯哪...嗯...嗯哪...啊(找不到了,哈哈哈) --------------------编程问答-------------------- 心跳包是这么个说法的吗?如果客户端不是你写的,能配合得了工作吗?
我实现的心跳包是通过tcp底层协议完成,不是应用层数据包,而是通过TCP会话状态包,socket API中有相关的选项设置,好好看winsocket相关API吧 --------------------编程问答-------------------- 如果是TCP连接,客户端断开了,那再发什么包都没用,应该要重新连接才行.TCP是由底层连接的.
如果是UDP连接,客户端是不是有响应,那要自己设置协议,定期发送信号,验证三次握手,确定可以传送包.
补充:VB , 网络编程