ZMQ Radio / Dish无法发送多部分消息

时间:2019-06-04 15:15:52

标签: c++ zeromq

我尝试在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)。

如果我将send命令替换为:

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

然后我得到rc = 6,并且能够通过Dish套接字读取(单个部分)消息。

您能帮我指出出什么问题吗?

1 个答案:

答案 0 :(得分:2)

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作为传输方式。