c++ - 无法使用 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 的未知字段中。可能是什么原因 ?
解决方案
当我发送足够大的消息时,我遇到了类似的问题。我们决定,当消息分成几个网络包时会发生这种情况。我们使用 blob 来防止这种情况,并且它有效。关于blob,它在消息之前发送消息长度的技术
推荐阅读
- python - 获取旋转线的坐标
- javascript - 如何自定义全日历日样式?
- node.js - 加密 Cookie 并保存到 Chrome
- swift - Swift 4 - 按下按钮播放声音并获取线程 1:致命错误:在展开可选值时意外发现 nil
- flutter - 更新示例计数器中的非立即状态 - BloC Flutter
- javascript - 导入数据后如何在 After Effects 中访问 XML 元素?
- python - 在 Python 中创建第一个游戏时遇到问题!语法错误
- javascript - 我的导航栏不会粘在屏幕顶部,使用 `position:sticky`
- docker - 如何构建 Ubuntu Server 作为自动化测试服务器
- email - 如何修复 mandrill / mailchimp 事务性电子邮件问题收件人域不匹配