首页 > 解决方案 > ZMQ Radio/Dish 无法发送多部分消息

问题描述

我尝试在 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 套接字读取(单部分)消息。

你能帮我指出哪里出了问题吗?

标签: c++zeromq

解决方案


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

推荐阅读