为什么带有ZMQ_DONTWAIT的zmq_recv()返回errno == 0而不是EAGAIN?

时间:2016-03-17 19:29:46

标签: windows zeromq nonblocking

我正在使用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

1 个答案:

答案 0 :(得分:1)

答案隐藏在windows标记中(感谢您包含 )。相关:http://api.zeromq.org/4-1:zmq-errno

具体做法是:

  

zmq_errno()函数用于帮助非POSIX系统上的用户直接检索正确的errno值时遇到问题。具体来说,Win32系统上的用户,其应用程序使用的是来自ØMQ使用的C运行时库的不同C运行时库,需要使用zmq_errno()进行正确操作。

您应该使用zmq_errno()而不是直接访问errno