免费注册 查看新帖 |

Chinaunix

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

请教如何判断socket客户端断开 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-21 19:09 |只看该作者 |倒序浏览
我写了一个socket的客户端和服务器端,请问服务器端如何判断客户端已经断开连接了

论坛徽章:
0
2 [报告]
发表于 2007-08-21 19:25 |只看该作者
如果断开了clinet端就发送FIN了

论坛徽章:
0
3 [报告]
发表于 2007-08-21 19:33 |只看该作者
如果客户端结束进程,会发出FIN,但是如果是网线拨了,服务器就不知道了。借楼主的贴讨论一下:
1.如果拨掉网线的时候服务哭正在阻塞读,且没有设置超时选项,它会阻塞多久才能知道不可达?
2.如果。。。。。。。。。。正在阻塞写,。。。。。。。。。。。。。。。。。。。。。。。?
(也没有设置KEEP_ALIVE)

论坛徽章:
0
4 [报告]
发表于 2007-08-21 20:10 |只看该作者
我用心跳机制来防止拔网线这中情况
client每间隔M秒发一个心跳包给server
若连续N秒server端没有收到client的心跳包,则认为client已经去见马克思了

论坛徽章:
0
5 [报告]
发表于 2007-08-21 20:22 |只看该作者
进程是这样可以的。但我用的是线程,客户端和服务器端都有两个收发线程,客户端发送线程退出,服务器的收线程怎么知道啊?

论坛徽章:
0
6 [报告]
发表于 2007-08-21 22:25 |只看该作者

一般应该这样:

1、心跳。
2、非阻塞方式。阻塞方式是不方便判断诸如:网线断开这样的异常情况的。说“不方便”,就因为还是依赖于程序的实现是怎么样的。

BTW:和进程还是线程无关。

[ 本帖最后由 NewCore 于 2007-8-21 22:42 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-08-21 23:33 |只看该作者
原帖由 Jass 于 2007-8-21 19:33 发表
如果客户端结束进程,会发出FIN,但是如果是网线拨了,服务器就不知道了。借楼主的贴讨论一下:
1.如果拨掉网线的时候服务哭正在阻塞读,且没有设置超时选项,它会阻塞多久才能知道不可达?
2.如果。。。。。 ...


linux下,默认值是 7200秒

论坛徽章:
0
8 [报告]
发表于 2007-08-21 23:34 |只看该作者
原帖由 linuxxinetd 于 2007-8-21 20:22 发表
进程是这样可以的。但我用的是线程,客户端和服务器端都有两个收发线程,客户端发送线程退出,服务器的收线程怎么知道啊?


服务器的收线程的 recv函数会返回0

论坛徽章:
0
9 [报告]
发表于 2007-08-22 08:31 |只看该作者
原帖由 yulc 于 2007-8-21 23:34 发表


服务器的收线程的 recv函数会返回0

就算服务器没收到数据时,recv函数也会返回0啊,不一定是客户端断开了的。

论坛徽章:
0
10 [报告]
发表于 2007-08-22 09:44 |只看该作者
原帖由 linuxxinetd 于 2007-8-22 08:31 发表

就算服务器没收到数据时,recv函数也会返回0啊,不一定是客户端断开了的。



谁这么告诉你的, 抽他.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP