Socket双向心跳包问题
我现在正在做一个程序,要求服务器端要检测客户端的存活,客户端也要检测服务器端的存活.想做个双向心跳包来实现,可以吗??? --------------------编程问答-------------------- 吃多了 --------------------编程问答-------------------- 哈哈,不懂,帮顶 --------------------编程问答-------------------- 没遇到过 学习`` --------------------编程问答-------------------- 关注,帮顶了............ --------------------编程问答-------------------- 来回应答。。。 --------------------编程问答-------------------- 没有人会吗?最好能给个例程--------------------编程问答-------------------- 客户定时发送一个包给服务器,服务器收到后回应一个包给客户就可以了 --------------------编程问答-------------------- 但是,如果客户端瓜了,服务器就不知道客户端瓜了
--------------------编程问答-------------------- 服务器在一定时间内收不到,不就可以认为客户端挂了吗。。。。 --------------------编程问答-------------------- 學習. --------------------编程问答-------------------- 只有UDP和移动连接才需要心跳包...
但是,如果客户端瓜了,服务器就不知道客户端瓜了
-------------
有个名词叫“Time Out”... --------------------编程问答-------------------- 严重同意TIMEOUT的说法 --------------------编程问答-------------------- 那要怎样知道TIME OUT??还有,如果要用定时器去做TIME OUT,万一定时器的时间已到,但其它线程还在占用SOCKET,这时定时器正要用SOCKET来发检测TIME OUT的包,这样会不会引起异常??? --------------------编程问答-------------------- 不知道你用的是长连接还是短连接,如果是长连接,那很容易判断客户端是否还没瓜,当然也就不需要心跳了。如果是短连接,那每一次的请求肯定用的不是同一个Socket,那就不用担心其它线程占用了。至于怎么判断超时,到MSDN里查查Socket.SendTimeout和Socket.ReceiveTime属性的帮助,里面有例子的。 --------------------编程问答-------------------- 客户端定时发送一个定义的心跳包给服务器,
服务器收到后回应一个定义的心跳包给客户就可以了
如客户端或服务器在指定的时间未收到心跳包,则认为对方断线 --------------------编程问答-------------------- 建立握手信号,服务器向客户端发消息等待回应,可以设置服务器等待时间,超过等待时间可以认为客户端挂了,如果严格点,可以重复这个过程3次。直到3次都收不到来自客户端的信号则认为客户端挂掉了。 --------------------编程问答-------------------- 用Keep-ALive可以检测网络是否被断开,具体的你可以去看看我的Blog:http://wzd24.cnblogs.com --------------------编程问答-------------------- time out 肯定是要用的,即使是握手的心跳包不也要3次握手嘛,,比较同意andy888666(andy) 的做法 --------------------编程问答-------------------- andy888666(andy)能给呢例子吗???wzd24(牧野)兄,我用Keep-ALive办法没有作用啊,我要立刻知道网络是否被断开,而且当时我没有执行Send或者Recvice操作.所以要用心跳包. --------------------编程问答-------------------- 用TIMER,我就怕发其它线程在发送时,TIMER已经OnTime,但这时Socket不是已经被占用了吗,所以心跳包发不出去. --------------------编程问答-------------------- 有人说用定时器检测TimeOut吗?不知道lz什么思维...
上面 effun(地瓜) 已经说了...到MSDN里查查Socket.SendTimeout和Socket.ReceiveTime属性的帮助,里面有例子的... --------------------编程问答-------------------- 这个握手信号就是你们内部的协议嘛
例如:发送这样一条数据
FFFFFFFFFFFFFFFFFFFF4A000D40000170000170000205 //16进制数
其中4A是数据包长度
000D是功能号
400001700001700002是数据
05是校验码 //4A000D400001700001700002做异或
上下通讯去解析协议 想怎么握手都行,哈哈!
我做的是串口通讯 --------------------编程问答-------------------- effun(地瓜) ( ) 信誉:100 2007-08-07 09:48:49 得分: 0
不知道你用的是长连接还是短连接,如果是长连接,那很容易判断客户端是否还没瓜,当然也就不需要心跳了。如果是短连接,那每一次的请求肯定用的不是同一个Socket,那就不用担心其它线程占用了。至于怎么判断超时,到MSDN里查查Socket.SendTimeout和Socket.ReceiveTime属性的帮助,里面有例子的。
=========================
心跳就是给长连接的。短连接要什么心跳?
长连接的问题在于,如果你把网线拔了,服务器要至少2个小时才知道你断了。
--------------------编程问答-------------------- 可以,建议使用UDP,如果有一方没有收到包,则认为对方异常,也可以使用串口等方式,IBM的双机热备就是这么搞的。 --------------------编程问答-------------------- A发送数据到B,B收到后马马上向A发送OK,A收到认为B没有挂。 如果A收不到OK 就在发2次,如果B仍然没有回复OK 则认为B挂了!如果是双向的,B主发A,也采取相同的办法 建立握手
--------------------编程问答-------------------- 那要怎样知道TIME OUT??还有,如果要用定时器去做TIME OUT,万一定时器的时间已到,但其它线程还在占用SOCKET,这时定时器正要用SOCKET来发检测TIME OUT的包,这样会不会引起异常???
====================================
无语....你说会不会异常 --------------------编程问答-------------------- 我的程序其实就是一个游戏,主机是游戏大厅,客户端是游戏,我现在要完成的是长连接,我的问题是,如果我的客户端突然因网络,或者是程序错误而没有SOCKET.CLOSE的话,这样大厅还一直存在这个客户端,这个出错的客户端就会不能重新连接上大厅,同样道理,在大厅因网络,或者是程序错误而没有SOCKET.CLOSE的话客户端仍然在游戏中,因为主机与客户端之间是很小数据交换的,所以用TIMEOUT,SO_KEEPALIVE不能立刻反应主机与客户端的连接状态,所以要用到心跳包. --------------------编程问答-------------------- 关注中……
等待诸位的结果! --------------------编程问答-------------------- 按你这样说,心跳包也不能立即获取状态
难道你连续不间断发送心跳包么... --------------------编程问答-------------------- Keep-Alive就是心跳包机制,而且这个心跳发送的时间间隔是可以调整的! --------------------编程问答-------------------- UP
UP
UP
--------------------编程问答-------------------- 我现在正在做一个程序,要求服务器端要检测客户端的存活,客户端也要检测服务器端的存活.想做个双向心跳包来实现,可以吗???
------------------------------------------------------------------------------------
回答:可以。 --------------------编程问答-------------------- 其实也比较好实现。 --------------------编程问答-------------------- 十分关注,等待结果! --------------------编程问答-------------------- 应该能吧 --------------------编程问答-------------------- 关注
--------------------编程问答-------------------- 求一个简单的心跳包的例子!496669112@qq.com 十二分感谢!
补充:.NET技术 , C#