近期调研和使用 zeromq 与 cppzmq 的一些问题
问题 使用 一些 调研 近期 zeromq
2023-06-13 09:17:34 时间
关于message
消息分片
消息分片的发送
消息分片允许将多个消息封装成一条消息。在发送自定义协议数据时,我们经常需要在消息前“填充”一个包头。如下代码,在发送的时候加上 zmq::send_flags::sndmore
标识(对应 zeromq ZMQ_SNDMORE
),表示后面还有消息。这样 zeromq 会将 ZMQ_SNDMORE
的消息和最后一段消息拼装成一条完整的消息发送。
int SendData(char* pMsg, int iMsgLen)
{
tagMsgHead stHead;
bzero(&stHead, sizeof(stHead));
...
stHead.Len = iMsgLen;
stHead.Crc = 0;
try
{
m_socket.send(zmq::const_buffer((const void*)(&stHead), sizeof(stHead)),zmq::send_flags::dontwait|zmq::send_flags::sndmore);
m_socket.send(zmq::const_buffer((const void*)(pMsg), static_cast<size_t>(iMsgLen)), zmq::send_flags::dontwait);
}
catch (...)
{
....
}
return 0;
}
消息分片的接收
需要注意的是,如果发送使用了 ZMQ_SNDMORE
分片,那么在接收时也需要分多次 recv
接收数据(这点比较麻烦)。开始的时候以为 recv
接收的是一个完成的包,后面才知道 recv
接收的其实是“帧”数据,多个“帧”拼装成一个消息。具体接收方法如下:
Buffer buffer;
while (1) {
// 接收消息
zmq_msg_t identify;
zmq_msg_t message;
zmq_msg_init(&identify);
zmq_msg_init(&message);
zmq_recvmsg(socket, &identify, 0);
zmq_recvmsg(socket, &message, 0);
buffer.Append(zmq_msg_data(&message), zmq_msg_size(&message));
// 检查是否还有更多消息可读
while(zmq_msg_more(&message)) {
zmq_recvmsg(socket, &message, 0);
buffer.Append(zmq_msg_data(&message), zmq_msg_size(&message));
}
zmq_msg_close(&identify);
zmq_msg_close(&message);
}
使用 cppzmq 的话,代码如下:
Buffer buffer;
while (1) {
// 接收消息
zmq::message_t identity;
zmq::message_t message;
socket.recv(identity, zmq::recv_flags::none);
socket.recv(message, zmq::recv_flags::none);
buffer.Append(message.data(), message.size());
// 检查是否还有更多消息可读
while(message.more()) {
socket.recv(message, zmq::recv_flags::none);
buffer.Append(message.data(), message.size());
}
}
使用 ZMQ_SNDMORE
后接收也需要分片接收,这个确实是比较麻烦的地方。个人觉得如果改成一次接收会更好,因为这样更符合使用的“直觉”。
后面会不断更新这部分,有新的问题会加进来。
相关文章
- nginx面试常见问题_面试官应该问哪些问题
- 最近解决的两个拖延数年的问题
- Android开发:CompoundButton.onCheckedChangeListener和RadioGroup.onCheckedChangeListener冲突问题「建议收藏」
- 使用缓存的几个问题
- axios挂载到vue项目中一些优化问题
- windows git 使用的一些问题和解决方案
- 使用 html2canvas 生成分享图片,CDN图片不展示问题
- 最近使用百度分享的api,引发 了一下问题,微博分享的页面跳转不成功
- python3和scrapy使用隧道代理问题以及代码
- CentOS 7 安装ror出现的问题
- 如何使用IP代理解决亚马逊账号IP关联问题?
- 【运筹学】对偶理论 : 对称理论示例 ( 对称理论 | 标准的原问题对偶问题 | 原问题目标函数求最小值示例 | 求对偶技巧 ) ★
- Hibernate实体类注解的问题详解编程语言
- [问题解决]使用mpur_message_forced时,校验消息添加到错误的采购订单行项目上详解编程语言
- 使用MySQL OGG解决数据同步问题(mysqlogg)
- 90分钟,17个问题带你深度了解精灵4无人机 | 雷锋网公开课
- 如何解决MySQL命令行闪退问题(mysql命令闪退)
- 如何解决Linux系统下使用cat命令出现的乱码问题?(linuxcat乱码)
- 极速解决:SQL Server远程慢查询问题(sqlserver远程慢)
- 使用SQL Server 13轻松解决数据存储问题(sqlserver13)
- 微擎禁用Redis,一个潜在的问题(微擎 redis 未开启)
- 解决mysql插入慢的问题(mysql一条插入很慢)
- 解决多进程使用同一Redis的问题(多进程使用同一redis)
- Redis高并发处理慢问题解决之道(redis高并发读写变慢)
- 在JavaScript中使用inline函数的问题
- win2003服务器使用WPS的COM组件的一些问题解决方法
- php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
- 基于HBaseThrift接口的一些使用问题及相关注意事项的详解