ZMQ recv on subscriber not respecting set timeout

ZMQ recv on subscriber not respecting set timeout

我正在尝试将 ZMQ 通信集成到一个测试用例中,但我遇到了 zmq::socket_t::recv 问题,即使我为该操作设置了 500 毫秒的超时,但本质上是无限期阻塞。展示该行为的最小测试用例如下所示

#include <gtest/gtest.h>
#include <zmq.hpp>

TEST(timeout, not_working_in_recv)
{
  zmq::context_t zmq_context;
  zmq::socket_t  sub(zmq_context, ZMQ_SUB);

  sub.setsockopt(ZMQ_SUBSCRIBE, nullptr, 0);
  int const timeout_ms = 500;
  sub.setsockopt(ZMQ_RCVTIMEO, &timeout_ms);
  sub.connect("inproc://pubsub_test");

  zmq::message_t msg;
  sub.recv(&msg);
}

还有更复杂的设置,我设置了一个线程来创建相应的发布者,但结果总是阻塞接收。该块不是很不确定,最终它实际上是 return.

这是在 Windows 10, x32 下使用 MSVC 2017 和 ZMQ 4.2.2 编译和执行的。

有谁知道为什么接收呼叫会阻塞以及如何解决这个问题?

超时设置不正确。行

sub.setsockopt(ZMQ_RCVTIMEO, &timeout_ms); // set timeout to address of timeout_ms variable

应该是

sub.setsockopt(ZMQ_RCVTIMEO, timeout_ms); // set timeout to value of timeout_ms