社区
网络编程
帖子详情
winsock编成,服务器端怎样能知道客户端异常断开(断电或者拔掉上网线)?
fangyc
2008-05-08 08:05:41
对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?
...全文
628
20
打赏
收藏
winsock编成,服务器端怎样能知道客户端异常断开(断电或者拔掉上网线)?
对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
一般通讯系统都采用定时发心跳包的方法
金蝶高级实施顾问
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秒向所有连接着 的客户端发送检查信息。如果发送后,客户端没有发回报信息,那就是说明已经断线了。
PB_
winsock
服务器端
与
客户端
服务器端
与
客户端
源代码,使用
winsock
实现
VB
winsock
多连接示例(
服务器端
返回
客户端
数据)
VB
winsock
多连接示例(
服务器端
返回
客户端
数据)
winsock
带注册文件
在
客户端
,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在
服务器端
,当ConnectRequest事件后,远程计算机(
客户端
)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当Data...
python如何判断tcp
异常
断开
_Tcp服务端判断
客户端
是否
断开
连接
好不容易调通了,然后就是一个需求,当
客户端
主动
断开
连接时,服务端也要
断开
连接,这样一下次
客户端
请求链接的时候才能成功链接。然后就开始找各种方法。其中简单的是看recv()返回为0,表明
断开
了链接,但是recv函数...
基于Windows的迭代回声
服务器端
/
客户端
(基于TCP的
服务器端
/
客户端
)
1.
服务器端
在同一时刻只与一个
客户端
相连,并提供回声服务。 2.
服务器端
依次向5个
客户端
提供服务并退出。 3.
客户端
接收用户输入的字符串并发送到
服务器端
。 4.
服务器端
将接收的字符串数据传回
客户端
,即“回声”。 5...
网络编程
1,502
社区成员
18,437
社区内容
发帖
与我相关
我的任务
网络编程
VB 网络编程
复制链接
扫一扫
分享
社区描述
VB 网络编程
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章