首页 > 解决方案 > 订阅者上的 ZMQ recv 不遵守设置超时

问题描述

我正在尝试将 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);
}

有更精细的设置,我设置了一个创建相应发布者的线程,但结果始终是阻塞接收。该块不是完全不确定的,最终它确实会返回。

在此处输入图像描述

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

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

标签: c++zeromq

解决方案


超时设置不正确。线

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 

推荐阅读