winsock编成,服务器端怎样能知道客户端异常断开(断电或者拔掉上网线)?

fangyc 2008-05-08 08:05:41
对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?
...全文
628 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangyc 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Tiger_Zhao 的回复:]
由客户端定时发送在线通知到服务端,这样的好处:
·即使各个客户端的网络拥挤程度不同,但是同一个客户端的消息发送到服务端的周期还是比较固定的;
·如果某个客户端断线,那么发送错误发生在客户端,服务端程序不受影响;
·服务端以几个周期没有收到在线通知为依据判断客户端离线(比如客户端5秒发送一次,服务端以30秒未收到更新做判断),可以避免偶尔丢包或客户端忙引起的误判。
[/Quote]

我想问这种方法是否就是所谓的 “一般通讯系统都采用定时发心跳包的方法”,这两个方法是不是同一个事情。

就是要求客户端每隔多少时间(比如5秒)通过调用SendData 函数来发送消息到服务器端。在服务器端判断,如果30秒以内没有收到就算断线?
fangyc 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tanjiunnya 的回复:]
引用 2 楼 fangyc 的回复:
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
所以是否有更好的,成熟的对于VB中编写winsock服务器端的方法?


哦。我以前写的就是这样子…
[/Quote]

我这里试过,如果客户端关闭掉,服务器还是相连接的情况下,在服务器端调用winsock.SendData "Hello" 函数不会马上出错的,大约过1分钟左右,winsock 才会触发error事件。这个时候才知道那个客户端出错了。甚至我再次做试验的时候,碰到了这种方法下,过了很长的时间,winsock 也不会触发error事件! 所以无法知道客户端一定出问题了。
你能说的在具体点吗。


我把我写的代码说一下:

客户端通过tcp协议连接了服务器端的winsock
然后我就把客户端的上网线拔掉。根据你说的思路就是要在服务器端上放1个时钟控件,然后我是每秒钟都调用
winsock.SendData "Hello" 给客户端。但是当拔掉上网线后,调用这个函数也不会出错,它很正常的在用。
fangyc 2008-05-09
  • 打赏
  • 举报
回复
好的,谢谢各位!结贴!
yinweihong 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 CathySun118 的回复:]
一般通讯系统都采用定时发心跳包的方法
[/Quote]

一般都是这么做的~!!
Tiger_Zhao 2008-05-09
  • 打赏
  • 举报
回复
由客户端定时发送在线通知到服务端,这样的好处:
·即使各个客户端的网络拥挤程度不同,但是同一个客户端的消息发送到服务端的周期还是比较固定的;
·如果某个客户端断线,那么发送错误发生在客户端,服务端程序不受影响;
·服务端以几个周期没有收到在线通知为依据判断客户端离线(比如客户端5秒发送一次,服务端以30秒未收到更新做判断),可以避免偶尔丢包或客户端忙引起的误判。
CathySun118 2008-05-09
  • 打赏
  • 举报
回复
一般通讯系统都采用定时发心跳包的方法
  • 打赏
  • 举报
回复
9楼连接里说的很清楚呀。

你有服务器端吧?服务器端检测每个连接在N分钟之内没有SEND过来,就是离线呀。

而客户端每M分钟要发个包过去。

这个N和M你自己调整好。根据网络情况,把延迟打进去。一般5分钟就可以了吧。
fangyc 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 myjian 的回复:]
顶顶.

心跳包应该没问题呀.
[/Quote]

请问你说的是TCP协议吗
嗷嗷叫的老马 2008-05-09
  • 打赏
  • 举报
回复
顶顶.

心跳包应该没问题呀.
yinweihong 2008-05-09
  • 打赏
  • 举报
回复
udp本来就是无连接不可靠的,那还掉啥线阿~ 没线可掉啊
tanjiunnya 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fangyc 的回复:]
好的,十分感谢!
我是用tcp协议的,可能得要换一个协议用用。
你认为VB做的这样的通讯的服务器程序,能够承载200个客户端的连接吗?
我是用winsock控件数组的,你是吗?
[/Quote]

我用Winsock控件(vb6 enterprise 版本),采用UDP连接了最多80多台没有出错过。
至于你的大型200多台,我就不知道了。
fangyc 2008-05-09
  • 打赏
  • 举报
回复
好的,十分感谢!
我是用tcp协议的,可能得要换一个协议用用。
你认为VB做的这样的通讯的服务器程序,能够承载200个客户端的连接吗?
我是用winsock控件数组的,你是吗?
tanjiunnya 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 fangyc 的回复:]
引用 10 楼 tanjiunnya 的回复:
引用 7 楼 fangyc 的回复:
引用 3 楼 tanjiunnya 的回复:
引用 2 楼 fangyc 的回复:
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问…
[/Quote]

很多人都选择TCP Protocol,不过我就喜欢UDP。
我写过网吧计时收银钱的软件,为学校写过锁荧幕的软件,全都是UDP方式来写的。
可以说侦测客户机器断线或在线几乎都没有出错。
fangyc 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tanjiunnya 的回复:]
引用 7 楼 fangyc 的回复:
引用 3 楼 tanjiunnya 的回复:
引用 2 楼 fangyc 的回复:
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
所以是否有更好的,成熟的…
[/Quote]

原来是这么回事
那请问,大部分的这类通讯系统都是用UDP包的啊?
of123 2008-05-09
  • 打赏
  • 举报
回复
定时发送消息要求应答。N 次无应答就认为掉线。
tanjiunnya 2008-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fangyc 的回复:]
引用 3 楼 tanjiunnya 的回复:
引用 2 楼 fangyc 的回复:
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
所以是否有更好的,成熟的对于VB中编写winsock服务器端的方…
[/Quote]

你用的是TCP吗?
我用的是比较冷门的UDP。所以不会出现你说的问题。
yinweihong 2008-05-09
  • 打赏
  • 举报
回复
心跳包
http://zhidao.baidu.com/question/32992581.html
tanjiunnya 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fangyc 的回复:]
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
所以是否有更好的,成熟的对于VB中编写winsock服务器端的方法?
[/Quote]

哦。我以前写的就是这样子的方式。连接了大约80多台客户机器。
我的思路就是:

每隔5秒,服务器向所有客户端IP发送信息。(用 For Loop 来循徊所有连接的IP)
当发送到客户端 X 的时候失败了,就当作对方连接失败了。

可以严格来说,没有监测错误的说。
虽然不知道你的情况怎么样,不过希望对你有帮助。
fangyc 2008-05-08
  • 打赏
  • 举报
回复
谢谢2楼的,
我以前处理的思路就是这样的。
但是如果客户端突然网络非常拥挤或者cpu资源客户端程序分配不到。那么会造成客户端无法给服务器发送回复信息,而误判了客户端掉线的情况。
而且隔多少时间给所有的客户端发送检查信息,也有点耗资源的,因为客户端数量一上去后,就有写问题了吧。
所以是否有更好的,成熟的对于VB中编写winsock服务器端的方法?
tanjiunnya 2008-05-08
  • 打赏
  • 举报
回复
在服务端程序内,设定一个Timer,比如5秒。

每5秒向所有连接着 的客户端发送检查信息。如果发送后,客户端没有发回报信息,那就是说明已经断线了。

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧