c++ - 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 套接字读取(单部分)消息。
你能帮我指出哪里出了问题吗?
解决方案
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 作为传输。
推荐阅读
- azure-active-directory - 使用 redirect_uri 传递自定义参数
- django - 无法使用 Apache2.4 在 django 中的同一域上托管多个站点
- sql-server - 在 SQL Server 中左连接 2 个表
- powershell - 将参数传递给 PowerShell 函数时的不同行为
- php - 如何在 Codeigniter 中从服务器端获取 id 或将 id 传递给数据表?
- django - Psycopg2:升级还是不升级
- python - 布尔值作为索引的 Python 效果 (a[a==0] = 1)
- macos - "Vault","Consul" 和 "Terraform" [Hashicorp products] 无法打开,因为开发者无法在 mac、Catalina 上验证问题
- php - php如何用preg_replace动态替换字符串范围?
- spring-boot - 无法从 Restcontroller 移除 stackTrace。只是想要响应体而不是获得不必要的 stackTrace