ZMQ recv на абонента, не соблюдающего установленное время ожидания - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь интегрировать связь 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);
}

Были более сложные настройки, в которых я настраивал поток, который создает соответствующего издателя, но результатом всегда был блокирующий прием. Блок не является неопределенным, в конце концов он действительно возвращает.

enter image description here

Это скомпилировано и выполнено в Windows 10, x32 с использованием MSV C 2017 и ZMQ 4.2.2.

Кто-нибудь знает, почему приемный вызов блокируется и как это можно исправить?

1 Ответ

0 голосов
/ 01 мая 2020

Тайм-аут установлен неправильно. Строка

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 
...