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
#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.
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仍然没有数据??
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
continue
}
但recv仍然没有数据??
#11
你到底要什么样的行为啊?是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
是不是 地址绑定错误了
#16
用tcpdump试试抓包,看看包是否到本机上了。。。在用nc这个命令模拟下 。。在用strace命令调式下。。问题总会解决的。。。。
#17
#18
是用select阻塞的么?
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.
#1
检查下 sockfd是否有效
#2
sockfd是有效的,因send是成功的。
#3
有没有抓包软件了,看看数据到了没有
#4
偶然是成功的,但大部分都是不成功的。
#5
没人会?
#6
发端的数据没有发出?
#7
send是成功的
#8
#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.
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仍然没有数据??
while(1) {
if(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)
continue
}
但recv仍然没有数据??
#11
你到底要什么样的行为啊?是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
是不是 地址绑定错误了
#16
用tcpdump试试抓包,看看包是否到本机上了。。。在用nc这个命令模拟下 。。在用strace命令调式下。。问题总会解决的。。。。
#17
#18
是用select阻塞的么?
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.
一般都是
select(socketfd, ...);
recv();
最好楼主给出接收部分代码看看.