本文介绍了如何使用 ZMQ 发送/接收使用协议缓冲区序列化的二进制数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在 ZMQ 套接字上发送一个对象(用 GPB 序列化).目前代码有一个额外的副本.如何将序列化数组直接写入message_t的数据?

I need to send an object (serialized with GPB) on a ZMQ socket. Currently the code have an extra copy. How do I directly write serialized array into message_ts data?

ABT_CommunicationProtocol introPacket;
// Fill the packet
message_t introMessage;
size_t dataLenght = introPacket.ByteSize();
char* temp = new char[dataLenght];
introPacket.SerializeToArray(temp, dataLenght);  // write data to temp
memcpy(introMessage.data(), temp, dataLenght);   // copy data to message
this->serverRquest.send(introMessage);

推荐答案

不要使用 zmq_send 而是使用 zmq_sendmsg

Don't use zmq_send but zmq_sendmsg

int cgi_msg_cnx_pool::PbToZmq(::google::protobuf::Message *src, zmq_msg_t *dest)
{
    int size = src->ByteSize();
    int rc = zmq_msg_init_size(dest, size);
    if (rc==0)
    {
        try
        {
            rc = src->SerializeToArray(zmq_msg_data(dest), size)?0:-1;
        }
        catch (google::protobuf::FatalException fe)
        {
            std::cout << "PbToZmq " << fe.message() << std::endl;
        }
    }
    return rc;
}

int cgi_msg_cnx_pool::ZmqToPb(zmq_msg_t *src, ::google::protobuf::Message *dest)
{
    int rc = 0;
    try
    {
        rc = dest->ParseFromArray(zmq_msg_data(src), zmq_msg_size(src))?0:-1;
    }
    catch (google::protobuf::FatalException fe)
    {
        std::cout << "ZmqToPb " << fe.message() << std::endl;
    }
    return rc;
}

这篇关于如何使用 ZMQ 发送/接收使用协议缓冲区序列化的二进制数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 04:34