CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

如何较好的识别非法离线的用户?(由物理原因引起的)继承的是CSocket类。谢谢!

楼主guokai1217(将军)2004-09-03 14:52:33 在 VC/MFC / 网络编程 提问

目前要处理的问题如下:  
  实现了一个通讯软件,基本功能已经实现。但是非法离线的状态还是没有一个好的解决方案!  
  客户端是手机、处理能力肯定比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

相关问题

  • socket 创建失败一般是什么原因(从csocket继承)
  • 继承了CSocket但OnAccept没能触发 怎么搞啊?
  • 请问为这里什么要继承两个CSocket类??
  • CSocket继承的类无法触发OnReceive事件
  • 继承
  • 继承
  • 继承??
  • 继承!!!
  • 我从CSocket继承了一个类,为什么编译的时候说为定义CSocket类呢,需要有关头文件吗??????
  • CSocket

关键词

  • 服务器
  • socket
  • 客户
  • 检测
  • 消息
  • 变量
  • 客户端
  • 谢谢
  • 线
  • 识别

得分解答快速导航

  • 帖主:guokai1217
  • huwei001982
  • oyljerry
  • PiggyXP
  • sxxny
  • longyii

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo