【问题标题】:How to send / receive binary data serialized with Protocol Buffers using ZMQ如何使用 ZMQ 发送/接收使用协议缓冲区序列化的二进制数据
【发布时间】:2019-09-22 18:41:07
【问题描述】:

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

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);

【问题讨论】:

    标签: c++ protocol-buffers zeromq


    【解决方案1】:

    不要使用 zmq_send 而是使用 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 的 C++ 端口,并且运行良好。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多