ZMQ Radio/Dish 无法发送多部分消息
ZMQ Radio/Dish cannot send multi-part message
我尝试在 ZMQ 无线电套接字上发送多部分消息,但收到 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 的 return 代码是 -1 并且 zmq_errno() returns 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 作为传输。
我尝试在 ZMQ 无线电套接字上发送多部分消息,但收到 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 的 return 代码是 -1 并且 zmq_errno() returns 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 作为传输。