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