免费注册 查看新帖 |

Chinaunix

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

while循环时候为什么recv会阻塞 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-28 17:58 |只看该作者 |倒序浏览
/*str[1024]*/
while(recv(sock,str,1024,0)>0)        {printf("%s",str);bzero(str,1024);fflush(stdout);}

就上面这个其实我不用循环一次也能读完,但用如果一次不能读完(str[10]的时候),while的时候读完所有内容后就一直阻塞着,这是为什么啊

当读完了recv不是返回0吗?应该自动跳出循环啊


我是新手,请大家指教。

论坛徽章:
0
2 [报告]
发表于 2007-06-28 18:02 |只看该作者
原帖由 sunceenjoy 于 2007-6-28 17:58 发表
/*str[1024]*/
while(recv(sock,str,1024,0)>0)        {printf("%s",str);bzero(str,1024);fflush(stdout);}

就上面这个其实我不用循环一次也能读完,但用如果一次不能读完(str[10]的时候),while的时 ...

说的不太清楚,看不太明白你的意思,多给点信息。

论坛徽章:
0
3 [报告]
发表于 2007-06-28 18:05 |只看该作者

回复 1楼 sunceenjoy 的帖子

recv()是阻塞的函数调用, 所以即使没有数据过来, 也会阻塞在那个地方. 除非你将它设为非阻塞的调用方式.

论坛徽章:
0
4 [报告]
发表于 2007-06-29 08:27 |只看该作者
第一次读完数据后,由于在while循环里面recv继续被调用,而此时没有数据到来所以被阻塞。

论坛徽章:
0
5 [报告]
发表于 2007-06-29 09:08 |只看该作者
原帖由 sunceenjoy 于 2007-6-28 17:58 发表
/*str[1024]*/
while(recv(sock,str,1024,0)>0)        {printf("%s",str);bzero(str,1024);fflush(stdout);}

就上面这个其实我不用循环一次也能读完,但用如果一次不能读完(str[10]的时候),while的时 ...

这是完全正常的

论坛徽章:
0
6 [报告]
发表于 2007-06-29 09:10 |只看该作者
断开返回0,并不是没有数据返回0。

[ 本帖最后由 yuanchengjun 于 2007-6-29 09:12 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2007-06-29 09:30 |只看该作者
阻塞函数就是这样呀!很正常呀!??

论坛徽章:
0
8 [报告]
发表于 2007-06-29 15:20 |只看该作者
是这么回事,我先向服务器发送一句,再接受返回的消息(recv),之后才发送第二句,再循环,直到全部发送结束。如果一直阻塞在那里,我怎么继续下面的啊,有人说设置不阻塞,我看recv最后一个好象没有这个功能啊。send有notblock

论坛徽章:
0
9 [报告]
发表于 2007-06-29 15:32 |只看该作者
原帖由 sunceenjoy 于 2007-6-29 15:20 发表
是这么回事,我先向服务器发送一句,再接受返回的消息(recv),之后才发送第二句,再循环,直到全部发送结束。如果一直阻塞在那里,我怎么继续下面的啊,有人说设置不阻塞,我看recv最后一个好象没有这个功能啊。se ...


就你这个问题,至少有两个办法。
1:你可以加上协议头,比如用前面四个字节表示消息的长度,然后你只接收这个长度的消息。
2:发送端发送完消息关闭socket,然后双发再重新connect。

至于是否阻塞,都解决不了你的问题。

论坛徽章:
0
10 [报告]
发表于 2007-06-29 17:22 |只看该作者
原帖由 福瑞哈哥 于 2007-6-29 15:32 发表


就你这个问题,至少有两个办法。
1:你可以加上协议头,比如用前面四个字节表示消息的长度,然后你只接收这个长度的消息。
2:发送端发送完消息关闭socket,然后双发再重新connect。

至于是否阻塞,都解 ...




nod
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP