前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >近期调研和使用 zeromq 与 cppzmq 的一些问题

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

原创
作者头像
聆湖听风
发布2023-03-20 16:12:09
9890
发布2023-03-20 16:12:09
举报
文章被收录于专栏:网络编程网络编程

关于message

消息分片

消息分片的发送

消息分片允许将多个消息封装成一条消息。在发送自定义协议数据时,我们经常需要在消息前“填充”一个包头。如下代码,在发送的时候加上 zmq::send_flags::sndmore 标识(对应 zeromq ZMQ_SNDMORE),表示后面还有消息。这样 zeromq 会将 ZMQ_SNDMORE 的消息和最后一段消息拼装成一条完整的消息发送。

代码语言:c++
复制
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 接收的其实是“帧”数据,多个“帧”拼装成一个消息。具体接收方法如下:

代码语言:c++
复制
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 的话,代码如下:

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于message
    • 消息分片
      • 消息分片的发送
      • 消息分片的接收
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档