ZMQ Radio / Dish не может отправить сообщение из нескольких частей - PullRequest
4 голосов
/ 04 июня 2019

Я пытаюсь отправить сообщение, состоящее из нескольких частей, в гнездо ZMQ Radio, но получаю ошибку EINVAL (неверный аргумент). Вот код, который отправляет первую часть сообщения:

#include <iostream>
#include <cstring>
#include "ZmqRadio.h"

using namespace std;

int main() {

  auto addr = "udp://127.0.0.1:4444";
  auto myGroup = "myGroup";
  std::string data = "Hello";

  void *context = zmq_ctx_new();
  void *radio = zmq_socket(context, ZMQ_RADIO);
  zmq_connect(radio, addr);

  zmq_msg_t msg;
  zmq_msg_init_size(&msg, 5);
  zmq_msg_set_group(&msg, myGroup);

  memcpy(zmq_msg_data(&msg), &data[0], 5);

  int rc = zmq_msg_send(&msg, radio, ZMQ_SNDMORE);
  if (rc == -1) {
    int err = zmq_errno();
    cout << "Error: " << err << endl;
  }
}

В этом случае код возврата zmq_msg_send равен -1, а zmq_errno () возвращает 22 (EINVAL).

Если заменить команду отправки на:

int rc = zmq_msg_send(&msg, radio, 0);

Затем я получил rc = 6, и я могу прочитать сообщение (из одной части) через мой Dish сокет.

Можете ли вы помочь мне указать, что происходит не так?

1 Ответ

2 голосов
/ 10 июня 2019

ZMQ_RADIO, шаблон ZMQ_DISH использует zeromq потокобезопасные сокеты . Потоково-безопасные сокеты не поддерживают составные сообщения.

От: http://api.zeromq.org/4-3:zmq-socket

Гнезда ZMQ_RADIO являются поточно-ориентированными. Они не принимают опцию ZMQ_SNDMORE при отправке. Это ограничивает их данными одной детали.

У вас есть два варианта.

  • Используйте другую структуру сообщения, чтобы упаковать ваши кадры (возможно, в msgpack), а затем отправить через RADIO DISH как одно сообщение.
  • Переключиться на ZMQ_PUB / ZMQ_SUB. Недостатком здесь является то, что вам нужно будет использовать TCP или PGM в качестве транспорта.
...