免费注册 查看新帖 |

Chinaunix

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

socket read() 返回 0 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-20 22:44 |只看该作者 |倒序浏览
请问高手:
   read()阻塞的读套接字时,应该只有对方断开连接才会返回0; 但是我在一个多线程程序中,对方并没断掉连接也返回0了,可能会有什么其他状况呢?

论坛徽章:
0
2 [报告]
发表于 2006-05-21 09:36 |只看该作者
没遇到过,几个线程应该做好互斥,用SELECT实现会比较好些,我以前就是这样写的,没出现过此问题

论坛徽章:
0
3 [报告]
发表于 2006-05-21 13:14 |只看该作者
楼主可以看一下setsockopt()函数中,有关于SO_RCVTIMEO和SO_SNDTIMEO套结字选项的描述。这2个选项是是给套接口甚至一个接收和发送超时时间的。

论坛徽章:
0
4 [报告]
发表于 2006-05-21 20:49 |只看该作者

回复 3楼 UnixPanther 的帖子

超时的话,也应该返回-1,而不是0嘛

论坛徽章:
0
5 [报告]
发表于 2006-05-22 14:38 |只看该作者
select超时返回0呀,可以加上试试,看有没有什么错误

论坛徽章:
0
6 [报告]
发表于 2006-05-22 16:52 |只看该作者
屏蔽一些中断了没

论坛徽章:
0
7 [报告]
发表于 2006-05-22 22:12 |只看该作者

回复 6楼 zhhui2000 的帖子

中断都屏蔽了, 只不过我们在子程序中不断创建socket,向服务器连接。难道socket()和accept()不是线程安全的?

论坛徽章:
0
8 [报告]
发表于 2006-05-22 23:31 |只看该作者

子程序中?

你是不是在父进程中创建的子进程?如果是,那么你需要先在子进程中将父进程开启的socket都关闭掉才可以。

你的这个情况,可能是多个线程同用一个socket了,记住,在linux下,socket从0开始记数,socket 0是有效的套接字。

论坛徽章:
0
9 [报告]
发表于 2011-06-05 16:02 |只看该作者
FIN可以随数据的一起收到的
在wireshark的info栏看不到[FIN]标记
导致误判对端没有关闭

论坛徽章:
0
10 [报告]
发表于 2011-06-05 16:24 |只看该作者
多线程的原因

1.if   recv   return   0   then   the   connection   is   graceful   closed   by   peer.
2.Please   check   the   value   of   recemsg   before   call   recv.if   the   data   changed   after   call   recv   then   you   received   data   already   otherwise   none   data   was   received.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP