Chinaunix

标题: while循环时候为什么recv会阻塞 [打印本页]

作者: sunceenjoy    时间: 2007-06-28 17:58
标题: while循环时候为什么recv会阻塞
/*str[1024]*/
while(recv(sock,str,1024,0)>0)        {printf("%s",str);bzero(str,1024);fflush(stdout);}

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

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


我是新手,请大家指教。
作者: duanjigang    时间: 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的时 ...

说的不太清楚,看不太明白你的意思,多给点信息。
作者: scutan    时间: 2007-06-28 18:05
标题: 回复 1楼 sunceenjoy 的帖子
recv()是阻塞的函数调用, 所以即使没有数据过来, 也会阻塞在那个地方. 除非你将它设为非阻塞的调用方式.
作者: clj    时间: 2007-06-29 08:27
第一次读完数据后,由于在while循环里面recv继续被调用,而此时没有数据到来所以被阻塞。
作者: cugb_cat    时间: 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的时 ...

这是完全正常的
作者: yuanchengjun    时间: 2007-06-29 09:10
断开返回0,并不是没有数据返回0。

[ 本帖最后由 yuanchengjun 于 2007-6-29 09:12 编辑 ]
作者: weigongwan    时间: 2007-06-29 09:30
阻塞函数就是这样呀!很正常呀!??
作者: sunceenjoy    时间: 2007-06-29 15:20
是这么回事,我先向服务器发送一句,再接受返回的消息(recv),之后才发送第二句,再循环,直到全部发送结束。如果一直阻塞在那里,我怎么继续下面的啊,有人说设置不阻塞,我看recv最后一个好象没有这个功能啊。send有notblock
作者: 福瑞哈哥    时间: 2007-06-29 15:32
原帖由 sunceenjoy 于 2007-6-29 15:20 发表
是这么回事,我先向服务器发送一句,再接受返回的消息(recv),之后才发送第二句,再循环,直到全部发送结束。如果一直阻塞在那里,我怎么继续下面的啊,有人说设置不阻塞,我看recv最后一个好象没有这个功能啊。se ...


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

至于是否阻塞,都解决不了你的问题。
作者: ivhb    时间: 2007-06-29 17:22
原帖由 福瑞哈哥 于 2007-6-29 15:32 发表


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

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




nod
作者: qilikacha    时间: 2007-06-29 17:43
fcntl(sockfd,F_SETFL,O_NONBLOCK);
作者: cookis    时间: 2007-06-30 00:04
use select () before recv
作者: GNM    时间: 2007-06-30 12:28
你的问题在于当recv(fd,buf,1024),没有接收到1024个单位时,recv会一直阻塞在那里等着接收剩余单位,所以就出现你这种情况了;一般可以使用select或setsocket给recv设个超时退出就行了,当没有新数据时等待如10秒就自动退出,返回0;信号也可以解决,
作者: yuanchengjun    时间: 2007-07-01 12:27
原帖由 sunceenjoy 于 2007-6-29 15:20 发表
是这么回事,我先向服务器发送一句,再接受返回的消息(recv),之后才发送第二句,再循环,直到全部发送结束。如果一直阻塞在那里,我怎么继续下面的啊,有人说设置不阻塞,我看recv最后一个好象没有这个功能啊。se ...


有没有策略解决一下问题?
1, "我先向服务器发送一句", 服务器怎么知道你的消息发送结束了?
2, "再接受返回的消息(recv)", 假设服务器知道消息发送结束, 并且已经返回消息; 那又怎么知道服务器返回的消息结束了?
3, "之后才发送第二句", 假设已经接受到服务器消息, 并且回了第二句, 那服务器又怎么知道第二句结束了?

一个办法是在消息前面自己加点东西,比如,表示消息多长的信息;还可以不这么干,加一个结束标识,如果是字符串,可以加'\0'.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2