[英]Errno 35 (EAGAIN) returned on recv call
我有一个套接字等待接收数据,然后在接收数据后,向前发送数据进行处理。 但是,然后它再次进行 recv,这次它没有收到任何返回 -1 并且在打印 errno 时它打印 35 (这是EAGAIN
)。
这只发生在 MAC OS Lion 操作系统上,对于其他操作系统,它运行得非常好
do{
rc = recv(i, buffer, sizeof(buffer), 0);
if (rc < 0){
printf("err code %d", errno);
}
if(rc == 0){
//Code for processing the data in buffer
break;
}
....
}while(1);
编辑:更正缩进和错误号
您可以将套接字设置为非阻塞模式或启用接收超时。 这是来自 mac 上的recv(2)
:
如果出现以下情况,调用将失败:
[EAGAIN]套接字被标记为非阻塞,接收操作会阻塞,或者已经设置了接收超时,并且在接收数据之前超时到期。
嗯,抱歉再次引用。 这次来自intro(2)
:
11 EDEADLK避免了资源死锁。 试图锁定可能导致死锁情况的系统资源。
...
35 EAGAIN资源暂时不可用。 这是一种临时情况,以后对同一例程的调用可能会正常完成。
只需使用strerror(3)
找出实际问题。
您的套接字处于非阻塞模式。 EAGAIN
是当没有数据可供读取时从recv()
(和其他系统调用)的正常返回。 从这个意义上说,这并不是一个真正的错误。
如果你的意思是你的套接字非阻塞,那么你需要对其进行监控,找出当有可用的数据,只有调用recv()
当有可用的数据。 使用poll()
(或 kqueue,特定于 FreeBSD 和 MacOS)来监控。 通常这是在应用程序的主事件循环中完成的。
如果你的意思不是让你的套接字是非阻塞的,那么你应该使用fcntl()
将它设置为阻塞更多:
flags = fcntl(i, F_GETFL, 0); /* add error checking here, please */
flags &= ~O_NONBLOCK;
fcntl(i, F_SETFL, flags); /* add more error checking here! */
但是你应该知道套接字(和所有文件描述符)的默认阻塞状态是阻塞,所以如果你的套接字处于非阻塞模式,那么这意味着某人或某物手动使其非阻塞。
在阻塞模式下, recv
调用将阻塞并等待更多数据,而不是返回EAGAIN
(或与EAGAIN
相同的EWOULDBLOCK
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.