c++ - 订阅者上的 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 下编译和执行的。
有谁知道为什么接收呼叫被阻止以及如何解决这个问题?
解决方案
超时设置不正确。线
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
推荐阅读
- python - 使用python更改路由器ipconfig
- javascript - 在 Heroku 上运行的 Node JS 服务器上使用私有代理
- swagger - 更改模型中的显示名称以在响应中显示
- javascript - 如果在 JavaScript 中单击了子项,则删除父项
- c# - Net core SST 使用 EF 进行通用排序
- javascript - 如何使用 React-select 创建单独的 DropdownIndicator 组件,以便它可以在项目的其他部分重用
- javascript - 我可以在 Laravel 的模式中刷新表格吗?
- django - Django多线程数据库更新
- sql - 为什么 laravel eloquont 关系返回空数组
- php - php error_log 在本地环境中不起作用