1

我正在将我的网络代码从 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 );
4

1 回答 1

3

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

如果它返回,-1那么errno价值将是有意义的。

recvfrom手册页:

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

简而言之:

在你打电话的那一刻recvfrom,没有什么可以读的

于 2013-01-31T16:44:16.770 回答