我尝试在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套接字读取(单个部分)消息。
您能帮我指出出什么问题吗?
答案 0 :(得分:2)
ZMQ_RADIO,ZMQ_DISH模式使用zeromq 线程安全套接字。线程安全套接字不支持多部分消息。
来自:http://api.zeromq.org/4-3:zmq-socket
ZMQ_RADIO套接字是线程安全的。他们在发送时不接受ZMQ_SNDMORE选项。这将它们限制为单个零件数据。
您有两个选择。