近期调研和使用 zeromq 与 cppzmq 的一些问题
关于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
后接收也需要分片接收,这个确实是比较麻烦的地方。个人觉得如果改成一次接收会更好,因为这样更符合使用的“直觉”。
后面会不断更新这部分,有新的问题会加进来。
近期调研和使用 zeromq 与 cppzmq 的一些问题的更多相关文章
- 文件类似性推断 -- SimHash
近期调研了一下simhash算法,它主要用在谷歌网页去重中.网上有非常多原理性的介绍. 既然能够用来推断文件的相似性,就想知道效果怎么样.simhash的准确度是否依赖于分词算法?是否和simhash ...
- 一个网络传输框架——zeroMQ 调研笔记
一.它是什么 zeroMQ,一个处理消息传输的库,重点在传输上,看起来它像是在socket上面封装了一层,让我们可以很容易的利用它来做N对M的数据传输,在分布式系统中很方便,在接收端它有round-r ...
- Solr调研总结
http://wiki.apache.org/solr/ Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境 ...
- ERP调研之 对话
开卷语: 2009年8月6号,A公司ERP项目顺利启动,按照项目进度的安排,项目组成员立即投入到紧张而又忙碌的的业务调研之中.这次为期3周的业务调研面向企业所有业务部门,包括产品部门.采购部门.计划部 ...
- WCF扩展之实现ZeroMQ绑定和protocolBuffer消息编码(一)概要设计
在我工作的项目中含有多种操作系统.多种设备.多种开发语言,因此需要使用跨平台的通信技术和自定义的消息编码.经过技术调研,ZeroMQ+ProtocolBuffer最终成为通信技术和编码方式.但是如 ...
- Solr调研总结(转)
Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试.两个核心配置文件介绍.中文分词器配置.维护索引 ...
- 【codenet】代码相似度计算框架调研 -- 把内容与形式分开
首发于我的gitpages博客 https://helenawang.github.io/2018/10/10/代码相似度计算框架调研 代码相似度计算框架调研 研究现状 代码相似度计算是一个已有40年 ...
- Solr调研总结(很详细很全面)
Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境搭建及调试;两个核心配置文件介绍;维护索引;查询索引,和在 ...
- GAN的调研和学习
近期集中学习了GAN,下面记录一下调研的结果,和学习的心得,疏漏的地方,敬请指正. 本文将分为几个部分进行介绍,首先是GAN的由来,其次是GAN的发展,最后是GAN的应用. 先把最近收集的资料列举一下 ...
- 开源APM应用性能管理工具调研
近期在设计一个DevOps平台.希望整合一个APM工具进来,由于APM既可用于性能測试也可用于运维性能监控,是典型的Dev+Ops产品. 商业的APM工具国内外已经有不少成熟产品了,而开源的好像不多见 ...
随机推荐
- 使用easypoi 最原始的代码进行导出Excel
首先,产品有需求,我们苦逼的程序员就得把需求实现.那么今天咱就把产品提的导出Excel的需求给他搞定.他的需求是这样的,很简单的Excel导出.样式如图所示:. 其实我们项目中的ExcelUtils工 ...
- 20202411 2020-2021-2 《Python程序设计》实验二报告
20202411 2020-2021-2 <Python程序设计>实验二报告 课程:<Python程序设计> 班级: 2024 姓名: 陈书桓 学号:20202411 实验教师 ...
- 定长线程池Demo
1 import java.util.concurrent.ExecutorService; 2 import java.util.concurrent.Executors; 3 4 /** 5 * ...
- 杭电OJ1029题C++实现
解题思路:因为要求的数出现的次数总是比其他数字出现的次数多1,所以若总是用相同的数去与其他的数相抵,那么最后只剩下一个,那就是要求的数. 另外需要注意的一点就是,最好不要去开长度为999999的数组, ...
- 学校——DFS图的遍历
学校实验 没什么多说的 就是实现一个图的遍历 由于学校已经输入的片段过于晦涩难懂 无法进行 在网上看了别人写的代码 提升了理解代码的一点能力 #include"string.h" ...
- .netcore 以widnows服务方式运行
应用需要 Microsoft.AspNetCore.Hosting.WindowsServices 的包引用. 生成主机时会调用 IHostBuilder.UseWindowsService. 若应用 ...
- word在指定页面设置页码
需求:比如,毕业论文前面几页要求罗马数字(摘要-目录)(这里设置页码格式即可完成),后面全是阿拉伯数字(这里比较难搞,以下方法是解决这里的) 方法: 1. 光标移到指定页面的第一个字符所在的位置前 2 ...
- 文献学习——A Deep Dive into Conflict Generating Decisions
A Deep Dive into Conflict Generating Decisions Md. Solimul Chowdhury, Martin Müller, Jia-Huai You:A ...
- 在Eclipse 中导入maven项目, progress对话框中出现importing maven project的进度条卡住
一.在Eclipse配置Maven 方法1:在Eclipse上下载,太慢了,不用 方法2:在电脑本地下载,然后Eclipse载入 二.方法2详细步骤 1.官网下载:http://maven.apach ...
- 3-1 熟悉Hadoop及其操作
Hadoop最早起源于Nutch.Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题--如何解决数十亿网页的存储和索引 ...