使用非阻塞套接字。调用recvfrom后,errno总是EAGAIN

时间:2012-11-29 18:26:36

标签: c++ linux sockets udp

我正在将我的网络代码从Windows移植到Linux,但并非没有问题。 出于某种原因,当我将套接字设置为非阻塞时,recvfrom将无法正常工作。你看,在我调用recvfrom之后,errno总是EAGAIN而且我收到的包数无关紧要,它总是EAGAIN。如果我注释掉将套接字设置为无阻塞的代码,则代码运行正常。那么它正在发挥作用,但它正在阻塞......

这是我用来将套接字设置为非阻塞的代码:

int nonBlocking = 1;
if ( fcntl( handle, F_SETFL, O_NONBLOCK, nonBlocking ) == -1 )
{
    std::cout << "failed to set non-blocking socket" << std::endl;
    return false;
}

关于我做错了什么的任何想法? (它在我的Windows构建中运行正常,使用:

DWORD nonBlocking = 1;
ioctlsocket( handle, FIONBIO, &nonBlocking );

1 个答案:

答案 0 :(得分:3)

首先,在检查errno值之前,您应该检查recvfrom()的返回值。

如果它返回-1,则errno值将有意义。

来自recvfrom联机帮助页:

  

如果套接字上没有可用消息,则接收呼叫等待   对于          要到达的消息,除非套接字是非阻塞的(参见fcntl(2)),          在这种情况下,返回值-1和外部变量errno          设置为EAGAIN。

简而言之:

当你致电recvfrom时,没有什么可读的