невозможно сформировать команду с использованием protobuf - PullRequest
0 голосов
/ 23 мая 2018

У меня есть следующий файл прото

пакет 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 для генерации .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 :: Сообщение.В чем может быть причина?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Я смог решить проблему.Было 2 вопроса

1) При преобразовании в ByteArray я заменил

 QByteArray byteArray =  QByteArray::fromRawData(static_cast<const char*>(data.data()), data.size());

на

QByteArray *byteArray =  new QByteArray(reinterpret_cast<const char*>(data.data()), data.size());

2) Способ отправки сообщениярозетка.Я просто использовал

const int nbBytes = itM->second->write(qByteArray);

вместо QTextStream

0 голосов
/ 23 мая 2018

У меня была похожая проблема, когда я отправлял достаточно большие сообщения.Мы решаем, что это происходит, когда сообщение делится на несколько сетевых пакетов.Мы используем капли, чтобы предотвратить это, и это работает.О блобах, их технике для отправки длины сообщения, перед сообщением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...