首页 > 解决方案 > 无法使用 protobuf 形成命令

问题描述

我有以下原始文件

包 DS3DExcite.Cpp.ExternalVariantSwitcher.ProtocolBuffers;

message DGCommand
{
    extensions 100 to max;
    enum Type
    {
        AttachModel = 1;
        AttachModelReply = 2;
        ....
        ...
         SwitchVariants = 4;
    }
    required Type type      = 1;
    required uint32 id      = 2;
    optional uint32 replyTo = 3 [default = 0];
    optional string message = 4;
}

message SwitchVariants
{
    extend DGCommand
    {
        required SwitchVariants command = 103;
    }

    message VariantState
    {
        required string variant = 1;
        required string state = 2;
    }

    repeated VariantState variants = 1;
    repeated string variantNames = 2;
    optional string state = 3;

}

我用 protobuf 2.4.1 版本编译了 proto 文件以生成 .pb.h 和 .pb.cc 文件

现在我形成命令

DS3DExcite::Net::PVCConnector::ProtocolBuffers::DGCommand commandObj;
    commandObj.set_type(DS3DExcite::Net::PVCConnector::ProtocolBuffers::DGCommand_Type_SwitchVariants);
    commandObj.set_id(3);
    DS3DExcite::Net::PVCConnector::ProtocolBuffers::SwitchVariants   *objVarState;
    objVarState = commandObj.MutableExtension(DS3DExcite::Net::PVCConnector::ProtocolBuffers::SwitchVariants::command);
    DS3DExcite::Net::PVCConnector::ProtocolBuffers::SwitchVariants_VariantState *state = objVarState->add_variants();

    state->set_state("OFF");
    state->set_variant("M_Carpaint_3");

我序列化消息

   int size = commandObj.ByteSize();

    int sizeSize = sizeof(int);

    std::vector<char> data(size ,0);
    memcpy(data.data(), &size, sizeSize);
    data.resize(size + sizeSize );
    commandObj.SerializeToArray(static_cast<void*>(&(data[0])+sizeSize) ,size);
    QByteArray byteArray =  QByteArray::fromRawData(static_cast<const char*>(data.data()), data.size());

我在 Qtcp 套接字上将此消息发送到服务器,该服务器对消息进行反序列化并从消息中提取信息。

在服务器端,这是要读取的代码

uint32 pendingData = 0;
        rcvSocket->HasPendingData(pendingData); //rcvSocket is the serversside socket 
        if (pendingData == 0)
        {
            UE_LOG(PVCConnector, Warning, TEXT("Lost connection to client."));



            break;
        }

TArray<char> newData;  //customized Array template
        newData.InsertZeroed(0, pendingData);
        int32 bytesRead = 0;
        rcvSocket->Recv(reinterpret_cast<uint8*>(newData.GetData()), pendingData, bytesRead);
        data += newData;

然而,在服务器端,所需的信息落在 ::google::protobuf::Message 的未知字段中。可能是什么原因 ?

标签: c++protocol-buffers

解决方案


当我发送足够大的消息时,我遇到了类似的问题。我们决定,当消息分成几个网络包时会发生这种情况。我们使用 blob 来防止这种情况,并且它有效。关于blob,它在消息之前发送消息长度的技术


推荐阅读