recv无数据返回

时间:2021-02-06 18:29:18
在ubuntu 11的gcc下,
nRet=recv(sockfd,buffer, 1024, 0);
总是没有数据返回,nRet总是返回-1,无论是否设置
fcntl(sockfd, F_SETFL, O_NONBLOCK)
情况都是一样,没有数据返回,循环做recv时,有Resource temporarily unavailable错误。
请问是什么原因呢?应该如何解决呢?
如果可以,请给出示例代码。
谢谢。

18 个解决方案

#1


检查下 sockfd是否有效

#2


sockfd是有效的,因send是成功的。

#3


有没有抓包软件了,看看数据到了没有

#4


偶然是成功的,但大部分都是不成功的。

#5


没人会?

#6


发端的数据没有发出?

#7


send是成功的

#8


该回复于2012-04-08 14:26:21被版主删除

#9


你的socket应该是非阻塞模式的,recv()发现没有数据,立即返回-1,改成阻塞模式的试试看

If no messages are available at the socket, the receive calls wait for a message

arrive,  unless the socket is nonblocking (see fcntl(2)), in which case the value -1

is returned and the external variable errno is set to EAGAIN  or  EWOULDBLOCK. 

#10


已经用fcntl(sockfd, F_SETFL, O_NONBLOCK)设置了非阻塞,而且在
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    continue
}
但recv仍然没有数据??

#11


引用 10 楼  的回复:
已经用fcntl(sockfd, F_SETFL, O_NONBLOCK)设置了非阻塞,而且在
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    continue
}
但recv仍然没有数据??

你到底要什么样的行为啊?是recv的时候,没有数据就立即返回,还是卡在那里等待数据的到来啊?

用O_NONBLOCK设置成了非阻塞模式,确实是没数据就立即返回-1啊,这样的行为没错啊~~

而且你还要确定一点,对端确实是有数据发过来了吗?这是你能recv到的前提~~

#12


非阻塞模式,还是select或epoll比较好,等数据到来异步处理一下。你这里直接返回了,没有错。但还是需要在某个时刻去读数据的。

#13


send成功不一定表示recv的sockfd正确,楼主可以看下sockfd变量引用是否正确

#14


如果我在本机启动一个tomcat,用这个程序访问   http://localhost:8080/index.jsp 时,recv就立即有数据返回,但当访问 http://www.baidu.com 时,就怎么也无数据返回。
不知道究竟是什么原因造成的???

#15


引用 14 楼  的回复:
如果我在本机启动一个tomcat,用这个程序访问   http://localhost:8080/index.jsp 时,recv就立即有数据返回,但当访问 http://www.baidu.com 时,就怎么也无数据返回。
不知道究竟是什么原因造成的???
是不是 地址绑定错误了

#16


用tcpdump试试抓包,看看包是否到本机上了。。。在用nc这个命令模拟下 。。在用strace命令调式下。。问题总会解决的。。。。

#17


该回复于2012-04-10 09:07:43被版主删除

#18


是用select阻塞的么?  
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.

#1


检查下 sockfd是否有效

#2


sockfd是有效的,因send是成功的。

#3


有没有抓包软件了,看看数据到了没有

#4


偶然是成功的,但大部分都是不成功的。

#5


没人会?

#6


发端的数据没有发出?

#7


send是成功的

#8


该回复于2012-04-08 14:26:21被版主删除

#9


你的socket应该是非阻塞模式的,recv()发现没有数据,立即返回-1,改成阻塞模式的试试看

If no messages are available at the socket, the receive calls wait for a message

arrive,  unless the socket is nonblocking (see fcntl(2)), in which case the value -1

is returned and the external variable errno is set to EAGAIN  or  EWOULDBLOCK. 

#10


已经用fcntl(sockfd, F_SETFL, O_NONBLOCK)设置了非阻塞,而且在
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    continue
}
但recv仍然没有数据??

#11


引用 10 楼  的回复:
已经用fcntl(sockfd, F_SETFL, O_NONBLOCK)设置了非阻塞,而且在
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
    continue
}
但recv仍然没有数据??

你到底要什么样的行为啊?是recv的时候,没有数据就立即返回,还是卡在那里等待数据的到来啊?

用O_NONBLOCK设置成了非阻塞模式,确实是没数据就立即返回-1啊,这样的行为没错啊~~

而且你还要确定一点,对端确实是有数据发过来了吗?这是你能recv到的前提~~

#12


非阻塞模式,还是select或epoll比较好,等数据到来异步处理一下。你这里直接返回了,没有错。但还是需要在某个时刻去读数据的。

#13


send成功不一定表示recv的sockfd正确,楼主可以看下sockfd变量引用是否正确

#14


如果我在本机启动一个tomcat,用这个程序访问   http://localhost:8080/index.jsp 时,recv就立即有数据返回,但当访问 http://www.baidu.com 时,就怎么也无数据返回。
不知道究竟是什么原因造成的???

#15


引用 14 楼  的回复:
如果我在本机启动一个tomcat,用这个程序访问   http://localhost:8080/index.jsp 时,recv就立即有数据返回,但当访问 http://www.baidu.com 时,就怎么也无数据返回。
不知道究竟是什么原因造成的???
是不是 地址绑定错误了

#16


用tcpdump试试抓包,看看包是否到本机上了。。。在用nc这个命令模拟下 。。在用strace命令调式下。。问题总会解决的。。。。

#17


该回复于2012-04-10 09:07:43被版主删除

#18


是用select阻塞的么?  
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.