免费注册 查看新帖 |

Chinaunix

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

网络客户端断开时,网络服务器的程序如何获知这个情况???? [复制链接]

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-19 18:03 |只看该作者 |倒序浏览
我在做一个Linux下的网络服务程序。客户端是项目中做好的,无法修改。
现在服务程序运行后,客户端和服务器程序连接上后,收发数据都很稳定。但是客户端断开后,服务器程序需要获知客户端断开这个情况,并关闭相应的服务线程。请问,客户端断开后,服务器端如何获知这个情况????谢谢 。

论坛徽章:
0
2 [报告]
发表于 2009-03-19 18:16 |只看该作者
发包探测

论坛徽章:
0
3 [报告]
发表于 2009-03-19 20:53 |只看该作者
你们的服务是基于什么网络协议的?

论坛徽章:
0
4 [报告]
发表于 2009-03-19 20:54 |只看该作者
原帖由 alexhappy 于 2009-3-19 18:16 发表
发包探测



绝对扯淡。

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
5 [报告]
发表于 2009-03-20 11:50 |只看该作者

回复 #3 wxjeacen 的帖子

基于TCP/IP协议的

论坛徽章:
8
2015年辞旧岁徽章
日期:2015-03-03 16:54:15午马
日期:2015-02-04 12:00:07羊年新春福章
日期:2015-02-04 11:57:56双子座
日期:2014-12-02 11:44:59金牛座
日期:2014-10-08 16:47:08狮子座
日期:2014-08-29 13:37:46巳蛇
日期:2014-08-26 17:32:29NBA常规赛纪念章
日期:2015-05-04 22:32:03
6 [报告]
发表于 2009-03-20 11:52 |只看该作者

回复 #2 alexhappy 的帖子

发包不行啊
因为线程开启后,是一个死循环来处理客户端的请求的。
现在问题是,一旦客户端断开后,服务器的线程就死循环,跑飞了。所以,我需要在客户端断开后,服务器能够判断出来,并关闭相应的线程。

论坛徽章:
0
7 [报告]
发表于 2009-03-20 11:57 |只看该作者
原帖由 zhj1011 于 2009-3-20 11:52 发表
发包不行啊
因为线程开启后,是一个死循环来处理客户端的请求的。
现在问题是,一旦客户端断开后,服务器的线程就死循环,跑飞了。所以,我需要在客户端断开后,服务器能够判断出来,并关闭相应的线程。

你设计的不好,服务器一段时间没接收到客户的数据就应该发包给客户端,然后客户端发包应答,如果无应答或超时就视为断开连接

论坛徽章:
0
8 [报告]
发表于 2009-03-20 13:24 |只看该作者
原帖由 alexhappy 于 2009-3-20 11:57 发表

你设计的不好,服务器一段时间没接收到客户的数据就应该发包给客户端,然后客户端发包应答,如果无应答或超时就视为断开连接

说的有道理,我们也是这么做的,双方通讯时,如果没有收到数据,到达检测周期时就发握手消息,如果对方关闭掉了,发送肯定失败,这样就知道了。

另外,如果你的客户端程序不想修改的话,我觉得倒可以在客户端另做一个程序,检测客户端的连接状态,比如通过netstat命令来查询。
如果知道客户端程序连接关闭了,就通过UDP包把信息发给服务器端,然后再根据 TCP四元组的信息决定是那条连接断开了,关闭就是了。

论坛徽章:
0
9 [报告]
发表于 2009-03-20 13:42 |只看该作者
好好看看stevens的网络编程第一卷,里面有介绍。服务器如果是守护进程的话,我们做法都是把所有的信号都IGN,掉,然后setopt,再打开有用的信号。

论坛徽章:
0
10 [报告]
发表于 2009-03-20 14:01 |只看该作者
奇怪了……如果是TCP连接,客户端断开服务器怎么会不知道(除非网络协议栈崩溃)?
在这种情况下,保活是为了探测客户端是否掉电(网络协议栈未正常结束)、或者网络不可达,并不是探测客户端是否关闭;

如果用的是UDP,传输层没有连接这回事。“连接”是由应用层协议去实现的,并不是服务器可以单方面实现的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP