【问题标题】:Why is zmq_recv() with a ZMQ_DONTWAIT returning an errno == 0 instead of EAGAIN?为什么带有 ZMQ_DONTWAIT 的 zmq_recv() 返回 errno == 0 而不是 EAGAIN?
【发布时间】:2016-03-20 00:23:49
【问题描述】:

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

【问题讨论】:

  • 您确定您的目标 API 版本吗?虽然 ØMQ/3.2.6 使用 ZMQ_DONTWAIT 有点旧,但有时为了分布式版本的交叉兼容性仍然使用 ØMQ/2.1.11 API 使用 ZMQ_NOBLOCK 并返回 0 成功,-1 失败。
  • @user3666197 我认为我正在运行 ZeroMQ 4.1 版。有时我在查找某些内容时会抓取错误的文档。
  • 为了清楚起见,您说zmq_recv() 返回-1,您对nRecvLen 的检查将您传递给您的printf(),而您的printf() 是在说errno = 0,对吗?
  • @Jason - 是的,就是这样

标签: windows zeromq nonblocking


【解决方案1】:

答案隐藏在您的windows 标签中(感谢您提供that)。相关:http://api.zeromq.org/4-1:zmq-errno

具体来说:

提供 zmq_errno() 函数是为了帮助在非 POSIX 系统上遇到问题的用户直接检索 errno 的正确值。具体来说,Win32 系统上的用户,如果其应用程序使用的 C 运行时库与 ØMQ 使用的 C 运行时库不同,则需要使用 zmq_errno() 才能正确操作。

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

【讨论】:

  • 谢谢,我(过去)在其他 API 调用中也遇到过这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多