我正在将我的网络代码从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 );
答案 0 :(得分:3)
首先,在检查errno
值之前,您应该检查recvfrom()
的返回值。
如果它返回-1
,则errno
值将有意义。
来自recvfrom
联机帮助页:
如果套接字上没有可用消息,则接收呼叫等待 对于 要到达的消息,除非套接字是非阻塞的(参见fcntl(2)), 在这种情况下,返回值-1和外部变量errno 设置为EAGAIN。
简而言之:
当你致电recvfrom
时,没有什么可读的