社区
网络编程
帖子详情
winsock编成,服务器端怎样能知道客户端异常断开(断电或者拔掉上网线)?
fangyc
2008-05-08 08:05:41
对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?
...全文
773
20
打赏
收藏
winsock编成,服务器端怎样能知道客户端异常断开(断电或者拔掉上网线)?
对我一直困扰的这个问题,请问如何处理。如果客户端是正常的关闭的,他势必会触发服务器端的winsock的close事件。但是如果他是我说的那两种情况(断电或者拔掉上网线),则不会触发这两个情况。而且我也试图用过winsock.State属性去判断过了,但是还是不行。在服务器端的值会永远保持等于7的,请问各位前辈,是否碰到过我这样的烦恼,该如何处理?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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秒向所有连接着 的客户端发送检查信息。如果发送后,客户端没有发回报信息,那就是说明已经断线了。
怎样实时判断socket连接状态?
对端正常close socket,或者进程退出(正常退出或崩溃),对端系统正常关闭 这种情况下,协议栈会走正常的关闭状态转移,使用epoll的话,一般要判断如下几个情况 处理可读事件时,在循环read后,返回结果为0 处理可写事件时,write返回-1,errno为EPIPE EPOLLERR或EPOLLHUP或事件 对...
linux tcp优雅关闭,优雅地关闭Socket;检测非正常
断开
的TCP连接
--------------------------------------------------------------------------------------------------------------------------------------[转载声明] 本文所有版权归原作者所有;如本文原作者不认可转载,请联系本空间删除。[相关资源] NA---------------...
优雅地关闭Socket;检测非正常
断开
的TCP连接
--------------------------------------------------------------------------------------------------------------------------------------[转载声明] 本文所有版权归原作者所有;如本文原作者不认可转载,请联系本空间删除。
[相关资源] NA
-----------------------------------------------------
c socket 单
线
程多用户并发
使用select函数可以以非阻塞的方式和多个socket通信。程序只是演示select函数的使用,功能非常简单,即使某个连接关闭以后也不会修改当前连接数,连接数达到最大值后会终止程序。 1. 程序使用了一个数组fd_A,通信开始后把需要通信的多个socket描述符都放入此数组。 2. 首先生成一个叫sock_fd的socket描述符,用于监听端口。 3. 将sock...
socket之KEEPALIVE机制与原理分析
LINUX之TCP连接时间----TCP keepAlive 详解 (2011-08-11 11:07:04)转载 标签: 杂谈 分类: linux 在一个正常的TCP连接上,当我们用无限等待的方式调用下面的Recv或Send的时候: ret=recv(s,&buf[idx],nLeft,flags); 或 ret=send(s,&buf[idx],nLef
网络编程
1,502
社区成员
18,432
社区内容
发帖
与我相关
我的任务
网络编程
VB 网络编程
复制链接
扫一扫
分享
社区描述
VB 网络编程
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章