C-如何添加多个标志

问题描述 投票:0回答:1

这是在函数中添加多个标志的正确方法吗?

recv(sfd, &buf, sizeof(buf), MSG_DONTWAIT | MSG_ERRQUEUE);

我在buf中没有收到错误消息。recv()不阻塞。我得到errno:11,表示“再试一次”。

c flags recv
1个回答
0
投票

您将标记添加到recv()的最后一个参数的方式很好。似乎您不了解MSG_DONTWAIT会做什么。

MSG_DONTWAIT标志将使recv()调用作为非阻塞操作执行。这意味着它将返回-1,并且errno设置为EAGAINEWOULDBLOCK,如果没有要返回的数据。

MSG_DONTWAIT(从Linux 2.2开始)

  • 启用非阻塞操作;如果操作会阻塞,呼叫失败,并显示错误EAGAINEWOULDBLOCK。这个提供与设置O_NONBLOCK标志(通过fcntl(2)F_SETFL操作),但不同之处在于MSG_DONTWAIT是按通话选项...

man 2 recv

如果要在返回数据之前阻塞recv(),请删除MSG_DONTWAIT标志,并确保未将套接字设置为O_NONBLOCK

© www.soinside.com 2019 - 2024. All rights reserved.