- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 Google 的 ProtocolBuffer 在服务器/客户端架构中发送/接收数据。我能够将两者与 winsock 连接起来,并且能够使用它从 ProtocolBuffer 发送和接收数据,但是反序列化服务器上的数据似乎存在问题(我没有做相反的事情,所以我不知道如果还有效的话)
这是我用来创建要发送到服务器的示例数据包的代码:
MessageID *message = new MessageID();
message->set_type(MessageID::Type::MessageID_Type_PLAYERDATA);
PlayerData::Vector2 *position = new PlayerData::Vector2();
position->set_x(10.0f);
position->set_y(25.0f);
PlayerData *data = new PlayerData();
data->set_health((UINT32)50);
data->set_allocated_position(position);
auto inventory = data->add_items();
inventory->set_itemid((INT32)1);
inventory->set_count((INT32)5);
message->set_allocated_playerdata(data);
m_pNetworkObject->Send(message);
这是实际通过 TCP 连接发送数据的代码:
// Serialize to string.
std::string sendData;
data->SerializeToString(&sendData);
// Convert data to const char*
const char* dataToSend = sendData.c_str();
int iResult;
iResult = send( ConnectSocket, dataToSend, data->ByteSize(), 0 );
if (iResult == SOCKET_ERROR)
{
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
exit(1);
}
所以,这是在客户端上运行的代码。现在,当我在服务器上收到此消息时,我从 ProtocolBuffer 收到以下错误:
Can't parse message of type "MessageID" because it is missing required fields: type
Can't parse message of type "PlayerData" because it is missing required fields: Position, Health
服务器端反编译winsock数据的代码是这样的:
// decompile to a proto file and check ID
MessageID* receivedData = new MessageID();
receivedData->ParseFromArray(&recv, strlen(recv));
// check and redeserialize
switch (receivedData->type())
{
case MessageID::Type::MessageID_Type_PLAYERDATA:
{
PlayerData* playerData = new PlayerData();
playerData->ParseFromArray(&recv, strlen(recv));
UsePlayerData(sock, playerData);
break;
}
case MessageID::Type::MessageID_Type_WORLDDATA:
{
WorldData* worldData = new WorldData();
worldData->ParseFromArray(&recv, strlen(recv));
UseWorldData(sock, worldData);
break;
}
}
奇怪的是,尽管错误表明数据不包含 Type 值,但它确实将其设置为 1 并且 switch 语句有效。之后,当我尝试查看 Position 和 Health 数据时,一切都为 0。
我不知道我做错了什么。我阅读了大部分 ProtocolBuffer 教程和帮助,但似乎无济于事。
编辑:我尝试在同一个应用程序中对数据进行序列化和反序列化(不涉及网络),并使用以下代码实现了这一点:
std::string sendData;
message->SerializeToString(&sendData);
MessageID* receivedData = new MessageID();
receivedData->ParseFromString(sendData);
如果我检查 receivedData 中的数据,它与原始对象“消息”中的数据完全相同(因此,正确的值)
最佳答案
您的问题是您正在使用 strlen()
来查找消息的长度。 strlen()
只查找第一个零值字节并假定它已经结束。这是文本字符串的约定,但不适用于 Protocol Buffer 等二进制消息。在这种情况下,strlen()
返回的大小太短,因此消息中缺少某些字段,但也可能发生相反的情况——strlen()
可能会超出缓冲区的末尾并返回太长的大小,甚至会导致程序崩溃。
因此,您需要确保消息的实际确切大小从发送方传达给接收方。
关于c++ - ProtocolBuffer 无法定义数据,尽管它已被接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634733/
我正在尝试在 visual studio 2015 中调试 app_engine 项目。到目前为止,我有这些行: 我安装了 pip:端点、protopc、appengine 和 google-api-
我有一个 OrderList 类型的 protobuf 消息 message OrderList { repeated Order orders = 1; } 我想将这个订单列表传递到我编写的自定
我正在尝试使用 Google 的 ProtocolBuffer 在服务器/客户端架构中发送/接收数据。我能够将两者与 winsock 连接起来,并且能够使用它从 ProtocolBuffer 发送和接
我想知道如何检索从字节加载的 protobuf 的类型。 例如: Worklist work = Worklist.newBuilder().build(); byte[] msg = work.to
是否可以以 ProtocolBuffer 格式在 BigQuery 中导入数据?我已经有一个(非常)大的数据集采用这种格式,现在我想将它们推送到 BigQuery。但如果我能避免翻译成 json 左右
嗨,我是一名中国 iOS 工程师。 我正在尝试在 iPhone 上运行 Protocol Buffer ,我下载了 metasyntactic project来自谷歌代码,并按照您的介绍进行操作。 但
我最近升级了我的代码库(Java、C++ 和 C#)以使用 proto3。就 C# 而言,这涉及对代码的 2000 多次更改。这主要是语义上的,而且一切都很好,但有一个问题我似乎无法理解;序列化/反序
我从我通常使用的原型(prototype)类创建了一个 ProtocolBuffer 对象,我需要将它序列化。现在,我获取该对象并对其调用 SerializeToArray(),如下所示: int s
从事宠物项目(cassandra、spark、hadoop、kafka)我需要一个数据序列化框架。查看常见的三个框架 - 即 Thrift、Avro 和 Protocolbuffers - 我注意到它
我们最近才在 out 平台中采用 ProtocolBuffers,并且我在 v3 中看到了 FieldMasks 的引入,但我们似乎无法弄清楚如何使用它们。 我们已经使用 v3 编译器生成了我们的 p
我正在编写一个程序,该程序应该通过 ZeroMQ 发送 C 结构。因此,我使用 Google 的 ProtocolBuffers 来序列化结构。 我现在遇到的问题是我的订户端没有收到任何内容。发布者打
我有这段代码,它在升级 GAE Python NDB 之前可以工作: class MyHandler(webapp2.RequestHandler): def get(self,urlString
我使用 protobuf-net 序列化了数据,并且能够在 C# 中进行相同的处理。 放置一个 C# 虚拟 w# var file = File.Create("animal.bin"); //Cre
我开始将自定义序列化机制迁移到 Protocol Buffer 。一种特别经常使用的数据类型是 BigDecimal。 有谁知道在 Protocol Buffer 中序列化它的好方法吗?我们当前的序列
我是一名优秀的程序员,十分优秀!