这是在函数中添加多个标志的正确方法吗?
recv(sfd, &buf, sizeof(buf), MSG_DONTWAIT | MSG_ERRQUEUE);
我在buf
中没有收到错误消息。recv()
不阻塞。我得到errno:11,表示“再试一次”。
您将标记添加到recv()
的最后一个参数的方式很好。似乎您不了解MSG_DONTWAIT
会做什么。
MSG_DONTWAIT
标志将使recv()
调用作为非阻塞操作执行。这意味着它将返回-1
,并且errno
设置为EAGAIN
或EWOULDBLOCK
,如果没有要返回的数据。
MSG_DONTWAIT
(从Linux 2.2开始)
- 启用非阻塞操作;如果操作会阻塞,呼叫失败,并显示错误
EAGAIN
或EWOULDBLOCK
。这个提供与设置O_NONBLOCK
标志(通过fcntl
(2)F_SETFL
操作),但不同之处在于MSG_DONTWAIT
是按通话选项...
如果要在返回数据之前阻塞recv()
,请删除MSG_DONTWAIT
标志,并确保未将套接字设置为O_NONBLOCK
。