免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5862 | 回复: 10
打印 上一主题 下一主题

c,服务端如何判断客户端是否还在运行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-02-08 13:54 |只看该作者 |倒序浏览
用TCP,SOCKET编写的。服务端等待客户端的请求,接受到后生成一个子进程来处理这个请求,随后就关闭这个相应的SOCKET,直到有新的请求。
可是现在要加一个功能就是,服务端要判断客户端是否在运行(无连接,所以不可能用心跳函数).请问要怎么做???
如果客户端定时给服务端发送信息来判断,那就要维持这个连接(直到连接断开,才判断为异常关闭),维持这个连接就要用一个子进程,如果200个客户端就要200个子进程!!!所以不能用这种方法,请问要怎么做!!!!!!!

[ 本帖最后由 snailbing 于 2007-2-8 19:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-02-08 14:45 |只看该作者
比如自己添加一个协议,从客户端定时向服务器端发送信息,只要一定时间没有受到即认为已经断开

当然,tcp自身就有负责维护连接的功能

论坛徽章:
0
3 [报告]
发表于 2007-02-08 18:21 |只看该作者
通常都有一个while(1)循环在的,要用户主动发起才断开连接的

论坛徽章:
0
4 [报告]
发表于 2007-02-08 19:38 |只看该作者
二楼你好,一般都是用这个办法的,
现在的问题是,不是维护联接,服务端是存生子进程来完成请求的,完成后就断开这个连接字,如果要维护链接,二百个客户端就有二百个子进程了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

论坛徽章:
0
5 [报告]
发表于 2007-02-08 20:38 |只看该作者
不太明白搂住到底想做什么,现不要谈怎么实现

论坛徽章:
0
6 [报告]
发表于 2007-02-08 20:55 |只看该作者
就是判断客户端的程序是否在运行
但是客户端和服务端之间没有数据传输(断开的)
一个考试系统,
服务端管理数据库,客户端在登录,获得题目,交卷时才和服务端连接,平时是断开的(关闭了连接字)
现在服务端要判断客户端的程序是否在运行,如果应断电或什么原因客户端停止运行,服务端就可以了解到情况

[ 本帖最后由 snailbing 于 2007-2-8 21:05 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-02-09 16:11 |只看该作者
有谁知道的帮帮忙!
现在有两种方案:
1,由客户端做监听,服务端主动发请求(服务端存有客户端的IP地址,是由客户端登录时获得)但是为什么在用getpeername取SOCKET哪一端的地址时(取客户端的)有时会得到0.0.0.0的错误地址
2,客户端每隔一段时间给服务端发个包,服务端做个时间标志存入数据库,过段时间再去数据库判断这个时间,如果和系统时间差一定的值(一定时间内没有更新),则判断为断开

第二种方法能正常实现,但是每一回都是修改数据库,效率不好!!!

论坛徽章:
0
8 [报告]
发表于 2007-02-09 21:38 |只看该作者
最简单的方法
(1): 客户端起一个线程,过一会就向服务端发一个UDP数据报,包含当前系统的时间戳,这样服务器端没有必要与每个客户端都保持连接,每来一个UDP包就更新客户端与服务器端通讯的最新时间
如果某个客户端最近一次跟服务端通讯的时间到目前的时间差超过一个阀值,就认为客户端不在线
或者
(2)服务端过一段时间就去向每个客户端发一个UDP消息查询在线状态,收到响应就认为在线,没有响应就认为不在线

[ 本帖最后由 duanjigang 于 2007-2-9 21:41 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-02-10 09:10 |只看该作者
duanjigang

你好,我本不太清楚时间戳的概念,能解释一下吗,谢谢

论坛徽章:
0
10 [报告]
发表于 2007-02-10 12:10 |只看该作者
用一个time_t型的变量保存一个时间值就表示简单的秒级的时间

  1. struct client_struct
  2. {
  3.         time_t CurrentTime;//这个客户端最近通讯的时间
  4.         int    AvtiveTime;//这个客户端可以存活的时间
  5.         struct sockaddr_in client_addr;//客户段地址
  6. }List[100];
复制代码

每收到一个消息,如果IP地址&某个结构体的IP相同,说明是同一台主机
更新时间

  1. time(&(List[i].CurrentTime))
复制代码

如果

  1. time_t current_time;
  2. time(&current_time);
  3. if(current_time - List[i].CurrentTime > List[i].ActiveTime)
  4. {
  5.   printf("%s not online\n", inet_ntoa(List[i].client_addr.sin_addr));
  6. }
  7. ....
复制代码

自己琢磨吧,这样作还是不错的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP