zmq中的zmq_msg_data

本文介绍了一个用于获取消息中数据的API——zmq_msg_data。通过此API,开发者可以轻松地访问到ZeroMQ消息内部的具体数据内容。成功调用后,返回的是指向消息数据的指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void *zmq_msg_data (zmq_msg_t '*msg')

 

api的数据是用来获取消息中的数据

 

成功返回的是该消息中包含数据的指针

 

   

void g_pZmqCtx = zmq_ctx_new(); void pMsgSocket = zmq_socket(g_pZmqCtx, ZMQ_SUB); if (!pMsgSocket) { std::cout << “Failed to create message socket” << std::endl; return; } if (0 != zmq_connect(pMsgSocket, TEST_MSG_ADDR)) { std::cout << "Failed to connect the message socket! code = " << zmq_errno() << " reason = " << zmq_strerror(zmq_errno()) <<std::endl; } zmq_setsockopt(pMsgSocket, ZMQ_SUBSCRIBE, “”, 0); zmq_msg_t filter, frameHeader,imgData; zmq_msg_init(&filter); zmq_msg_init(&frameHeader); zmq_msg_init(&imgData); int nRecvLen = 0; while (true) { QApplication::processEvents(); nRecvLen = zmq_msg_recv(&filter, pMsgSocket, 0); if (nRecvLen < 0) { int err = zmq_errno(); printf(“Error: %s\n”, zmq_strerror(err)); std::cout << “Failed to receive filter” << std::endl; } else { nRecvLen = zmq_msg_recv(&frameHeader, pMsgSocket, 0); ((char)zmq_msg_data(&frameHeader))[nRecvLen] = ‘\0’; QJsonObject objData; QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson((char)zmq_msg_data(&frameHeader), &error); if (error.error != QJsonParseError::NoError) { qDebug() << “QJsonParseError” << error.errorString(); } objData = doc.object(); int nIndex = objData[“index”].toInt(); int nWidth = objData[“width”].toInt(); int nHeight = objData[“height”].toInt(); if (0 == std::string(static_cast<char*>(zmq_msg_data(&filter))).find(“RgbImg”)) { int nChannels = objData[“channels”].toInt(); nRecvLen = zmq_msg_recv(&imgData, pMsgSocket, 0); if (nRecvLen < 0) { std::cout << “Failed to receive message” << std::endl; } else { std::cout << "receive rgb data index : " << nIndex << std::endl; … … } } } } 优化这段代码
最新发布
08-06
### 使用 `zmq::recv_flags::none` 的具体含义 在 ZeroMQ 库中,`zmq::recv_flags::none` 是一种标志位设置方式,用于指定接收消息的行为。当调用 `zmq_msg_recv` 函数时,可以通过传递不同的标志来控制如何处理接收到的消息[^1]。 如果使用了 `zmq::recv_flags::none`,这意味着没有任何特殊选项被启用,函数将以默认行为执行消息接收操作。这种情况下,程序会阻塞直到有完整的消息可用为止,并且不会跳过任何部分或片段。以下是其主要特点: - **阻塞性质**:如果没有消息到达,则线程会被挂起,等待消息的到来后再继续运行。 - **完整消息接收**:ZeroMQ 确保只有当整个多帧消息都被成功接收后才会返回给应用程序;否则不返回任何数据。 下面是一个简单的例子展示如何利用此参数完成基本的消息读取功能: ```cpp #include <zmq.hpp> #include <iostream> int main() { zmq::context_t context(1); zmq::socket_t socket(context, ZMQ_PULL); // 假设已经绑定了地址... zmq::message_t message; int rc = socket.recv(&message, zmq::recv_flags::none); // 阻塞直至完全接收到一条消息 if (rc != -1){ std::cout << "Received: " << static_cast<char*>(message.data()) << std::endl; } else{ perror("Failed to receive"); } return 0; } ``` 上述代码展示了通过设定 `zmq::recv_flags::none` 来实现标准模式下的消息获取过程。注意这里我们假设之前已正确配置好了套接字类型以及绑定/连接等相关初始化工作[^2]。 #### 多帧消息的注意事项 对于涉及多帧传输的情况(即每条消息由若干连续帧构成),即使采用无附加标记的方式(`zmq::recv_flags::none`)逐次提取各单独帧内容也是可行的。这是因为每次调用都会自动定位到当前未处理的第一帧位置上[^2]。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值