如何较好的识别非法离线的用户?(由物理原因引起的)继承的是CSocket类。谢谢!
目前要处理的问题如下:
实现了一个通讯软件,基本功能已经实现。但是非法离线的状态还是没有一个好的解决方案!
客户端是手机、处理能力肯定比PC弱。但是这块的原理比较类似。
有新的客户端和服务器建立了连接、就会向服务器设置的链表中加入一个新的SOCKET变量。在以后的交互中就会用每个客户端在服务器上对应的SOCKET变量来相互发送消息。但是如果客户端因为物理原因非法退出了(没有提交离线请求)。怎么样才能较好的检测到这种非法离线的情况呢?
所查资料里面主要提到的有:心跳检测;客户端收到消息发送确认信息 等等。
但是由于改动客户端的工作量较大。主要想从服务器端来进行判断,因为每一个和客户端相关的SOCKET变量都存在服务器的链表(内存)当中。有没有什么办法能够直接在服务器端判断每一个SOCKET对象的状态从而识别所对应的客户端是否在线?
希望有经验的朋友分享一下经验!谢谢!
问题点数:50、回复次数:17Top
1 楼guokai1217(将军)回复于 2004-09-03 14:59:55 得分 0
如果有能够在服务器端直接检测的方案最好。就是根据在内存中已存的SOCKET变量来识别和它对应的客户端状态。
如果用需要和客户端需要交互消息的方式来判断是否在线、让我比较迷惑的就是:对于每一个客户端定时发送的消息在服务端进行怎么样的处理才能比较高效的判别非法离线的客户端?Top
2 楼guokai1217(将军)回复于 2004-09-03 15:04:29 得分 0
在线等待!--期待高手!Top
3 楼guokai1217(将军)回复于 2004-09-03 15:23:09 得分 0
问题没有表述清楚么?如果有热心的朋友关心改帖,有不清楚的地方请提示表述有问题,谢谢!Top
4 楼huwei001982(凶猛的小狗)回复于 2004-09-03 15:47:56 得分 10
如果有可能的话, 在服务器端 设置一个计时器, 长度可以稍长点 ( > 5 秒)
在计时器中判断 Socket链表中每个 Socket的状态, 就可以处理了.Top
5 楼guokai1217(将军)回复于 2004-09-03 15:55:18 得分 0
也是这样想的。就是想判断每个Socket的状态,但是如果客户端非法离线了(没有正常向服务器发送离线请求),链表中的Socket变量是依然存在的呀。用什么方法可以判断?
用户在线与非法离线两种状态下存在于服务器端链表中的Socket变量有什么区别?
谢谢~^!^Top
6 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-03 15:58:07 得分 0
估计还是要用心跳包Top
7 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-03 16:02:55 得分 10
socket变量应该反映不出在线与离线来Top
8 楼guokai1217(将军)回复于 2004-09-03 16:19:06 得分 0
谢谢!但是能够确认用Socket变量不能识别在线与离线状态么?
如果实在不行、请问一下用按照这种情况用心跳包的检测方法?
我对这种方法的理解是:在客户端和服务器上都设置时钟。比如说客户端10s向服务器发送一次在线消息,(服务器收包后改变Socket对象里面的在线状态变量为TRUE)。服务器每隔15~20s检测链表中所有的Socket。处理所有状态为离线的Socket对象。并且初始化所有的在线状态是FALSE。
是这样的么?因为看到关于这种方案比较多、但是没有找到具体的算法。请提示!谢谢!
当然最好是能把负载放在服务器端(受限于具体的应用)。Top
9 楼guokai1217(将军)回复于 2004-09-03 16:25:08 得分 0
呵呵、谢谢楼上的两位朋友!跑题问题:TO:☆勇敢的心☆ 是源自于主人公是”威廉.华莱士“ 的那部 《勇敢的心》么?我也非常喜欢那部电影。没事的时候还老听电影中的风笛!Top
10 楼guokai1217(将军)回复于 2004-09-03 17:35:16 得分 0
呵呵、怎么没有人回答啊?是不是分太少。如果方案比较好、想要分的话随便开口。<=200分随便开。可以到WEB版去放分。(在那有小裤衩比较多、可以放200分)!Top
11 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-03 18:52:41 得分 0
嗯,当初就是看了那部电影,感动了Top
12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-09-03 19:08:02 得分 0
楼主你的方法可以试试。
may you successTop
13 楼PiggyXP(【小猪】技术太差没脸上班,只好去念Ph.D了-_-b)回复于 2004-09-04 14:18:11 得分 10
《勇敢的心》我也超喜欢,看了三遍呵呵,苏菲马索和梅尔吉布森我都非常喜欢^_^
至于楼主说的问题,恐怕还是要靠心跳包来解决的
比如你说的每隔10秒钟往服务器发一个连接有效的消息,如果某一次没有收到某一个socket发来的消息则可以确定某一个socket断开了Top
14 楼sxxny(轻云(Srj))回复于 2004-09-04 15:58:19 得分 15
我最近也在做一个有同样要求的系统;
我现在用的方法是客户端每隔4分钟发送一个活动报告给服务器的方法(因为系统的实时要求并不高,而且我试过,如果间隔太短会很站用网络资源).
目前来看运作是好的.
期待更好的方法.Top
15 楼sxxny(轻云(Srj))回复于 2004-09-04 16:02:21 得分 0
我对这种方法的理解是:在客户端和服务器上都设置时钟。比如说客户端10s向服务器发送一次在线消息,(服务器收包后改变Socket对象里面的在线状态变量为TRUE)。服务器每隔15~20s检测链表中所有的Socket。处理所有状态为离线的Socket对象。并且初始化所有的在线状态是FALSE。
=======================================================================
时间太短的话很容易出现错误判断.
我是在windows操作系统下试的. 因为你不能保证你的消息能立刻到达服务器(特别在网络忙的时候),还有Windows是一个分时操作系统, 他也不能保证你的消息能及时的处理.
所以我最后选择加长了发送和检查的时间间隔Top
16 楼longyii(【深渊上的缥缈】)(☆)回复于 2004-09-04 16:26:59 得分 5
可以在Server端为每个连接的Socket设置一个计数器,每次定时到了将其自动加1,如果这个计数器超过了某个限定值,即认为客户断开;
同时在Client端设置定时器,定时向Server端发在线消息,Server每收到一次在线消息就将对应的计数器归零;
Top
17 楼guokai1217(将军)回复于 2004-09-06 12:53:05 得分 0
好的、谢谢热心回答问题的各位朋友。具体的方法我在去试一下。如果有好的解决方案再来告诉大家。
Top




