首页 > 其他分享 >近期调研和使用 zeromq 与 cppzmq 的一些问题

近期调研和使用 zeromq 与 cppzmq 的一些问题

时间:2023-03-20 16:13:55浏览次数:42  
标签:socket buffer cppzmq msg zeromq zmq recv message 调研

关于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 后接收也需要分片接收,这个确实是比较麻烦的地方。个人觉得如果改成一次接收会更好,因为这样更符合使用的“直觉”。

后面会不断更新这部分,有新的问题会加进来。

标签:socket,buffer,cppzmq,msg,zeromq,zmq,recv,message,调研
From: https://www.cnblogs.com/listenwind666/p/17236653.html

相关文章

  • 再谈性能测试之需求调研
    转载:https://www.cnblogs.com/imyalost/p/9941938.html之前的博客聊聊性能测试开始前的准备工作,聊了一些关于性能测试开始前要做的准备工作。这篇博客,来谈谈性能测试开始......
  • python读写excel文件调研
    xlrd、xlwt和openpyxl模块的比较:1)xlrd:对xls、xlsx、xlsm文件进行读操作–读操作效率较高,推荐2)xlwt:对xls文件进行写操作–写操作效率较高,但是不能执行xlsx文件3)ope......
  • 亚马逊RedShift调研-浅谈技术框架、优缺点及网上风评
    RedShift是亚马逊开发的一个站式云上数据仓库服务。网上案例与风评较少,做的一些个人总结。1.RedShift优势及特色1.1官方介绍①借助AmazonRedshift的数据仓库......
  • ChatGPT调研分析与应用场域结合构想
    作者:京东科技胡骏摘要1.ChatGPT调研分析2022年11月30日,ChatGPT横空出世,在全球范围内形成了热烈的讨论。根据Similarweb的数据,今年1月,平均每天约有1300万独立访客使用......
  • AndroidApex技术分析调研1-apexd-bootstrap执行流程分析
    分析代码基线android10-releaseAPEX:AndroidPonyEXpress安卓运行环境AndroidRuntime(ART)将会在安卓12中,添加到ProjectMainline当中,这意味着可以通过GooglePlay商店......
  • AndroidApex技术分析调研2-apexd执行流程分析
    分析代码基线android10-releasesystem\apex\apexd\apexd.rc```rcserviceapexd/system/bin/apexdclasscorecriticaluserrootgroupsystem......
  • 稀土智能工厂调研纪实
    1.现场调研这是一个投资80亿的智能化的稀土厂区规划项目,2023年年前与该项目的一号负责人进行汇报与交流,年后双方人员进一步对接。对于未来稀土领域的智能化建设,......
  • 智慧口岸建设,市发改委专家前来我司调研
    版权声明:本文章由“上海美华系统有限公司”编辑组汇编而成,未经授权和许可,任何个人或媒体不得对本网站的文章及其他信息资料予以复制、转载、抄袭、改编。上海美华系统有限......
  • GameFrameWork调研
     自上而下对应  Config提供了全局配置的读写功能,可用,但是没有意义,因为直接用1个全局静态类,直接读写就好了,更高效方便。而二进制功能需要的话,用scripObject方式也......
  • 数据管理之数据治理项目:数据调研
    项目实施主要分为项目启动阶段、前期需求调研确认阶段、产品功能实现确认阶段、数据标准化初装阶段、系统培训阶段、系统上线测试及试运行阶段、总体验收阶段、系统交......