为什么 zmq_recv() 和 ZMQ_DONTWAIT 返回 errno == 0 而不是 EAGAIN?
Why is zmq_recv() with a ZMQ_DONTWAIT returning an errno == 0 instead of EAGAIN?
我正在使用 ZeroMQ
.
编写一个小型测试应用程序
我有一个测试场景是没有服务器 运行 连接到。
所以,在那种情况下,我将 ZMQ_DONTWAIT
传递给 zmq_recv()
,期望出现 EAGAIN
错误,但得到的 errno
值为 0。
示例客户端代码如下:
int rc;
void *context = zmq_ctx_new();
void *requester = zmq_socket(context, ZMQ_REQ);
int nLingerOption = 0;
rc = zmq_setsockopt(requester, ZMQ_LINGER, &nLingerOption, sizeof(nLingerOption));
rc = zmq_connect(requester, "tcp://127.0.0.1:5555");
int nSendLen = zmq_send(requester, "M", 1, 0);
char buffer[1000];
int nRecvLen = zmq_recv(requester, buffer, sizeof(buffer)-1, ZMQ_DONTWAIT);
if( nRecvLen < 0 )
printf("errno = %d\n", errno);
为什么输出是 0
而不是 EAGAIN
(在我的系统上定义为 11)。
编辑:这是 运行 ZeroMQ 版本 4.1
答案隐藏在您的 windows
标签中(感谢您包含 that)。相关:http://api.zeromq.org/4-1:zmq-errno
具体来说:
The zmq_errno() function is provided to assist users on non-POSIX systems who are experiencing issues with retrieving the correct value of errno directly. Specifically, users on Win32 systems whose application is using a different C run-time library from the C run-time library in use by ØMQ will need to use zmq_errno() for correct operation.
您应该使用 zmq_errno()
而不是直接访问 errno
。
我正在使用 ZeroMQ
.
我有一个测试场景是没有服务器 运行 连接到。
所以,在那种情况下,我将 ZMQ_DONTWAIT
传递给 zmq_recv()
,期望出现 EAGAIN
错误,但得到的 errno
值为 0。
示例客户端代码如下:
int rc;
void *context = zmq_ctx_new();
void *requester = zmq_socket(context, ZMQ_REQ);
int nLingerOption = 0;
rc = zmq_setsockopt(requester, ZMQ_LINGER, &nLingerOption, sizeof(nLingerOption));
rc = zmq_connect(requester, "tcp://127.0.0.1:5555");
int nSendLen = zmq_send(requester, "M", 1, 0);
char buffer[1000];
int nRecvLen = zmq_recv(requester, buffer, sizeof(buffer)-1, ZMQ_DONTWAIT);
if( nRecvLen < 0 )
printf("errno = %d\n", errno);
为什么输出是 0
而不是 EAGAIN
(在我的系统上定义为 11)。
编辑:这是 运行 ZeroMQ 版本 4.1
答案隐藏在您的 windows
标签中(感谢您包含 that)。相关:http://api.zeromq.org/4-1:zmq-errno
具体来说:
The zmq_errno() function is provided to assist users on non-POSIX systems who are experiencing issues with retrieving the correct value of errno directly. Specifically, users on Win32 systems whose application is using a different C run-time library from the C run-time library in use by ØMQ will need to use zmq_errno() for correct operation.
您应该使用 zmq_errno()
而不是直接访问 errno
。