gpt4 book ai didi

c++ - 使用非阻塞套接字。 errno 在调用 recvfrom 后总是 EAGAIN

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:57:58 24 4
gpt4 key购买 nike

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

最佳答案

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

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

来自 recvfrom 手册页:

If no messages are available at the socket, the receive calls wait for a message to arrive, unless the socket is nonblocking (see fcntl(2)), in which case the value -1 is returned and the external variable errno set to EAGAIN.

简而言之:

在你调用recvfrom的那一刻,没有什么可读的

关于c++ - 使用非阻塞套接字。 errno 在调用 recvfrom 后总是 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13632275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com