使用谷歌插件编程中的谷歌protobuf序列化和反序列化消息

时间:2015-01-21 05:50:59

标签: c++ sockets protocol-buffers

发送到服务器端的消息格式如下:

package test;

message Test {
  required int32 id = 1;
  required string name = 2;
}

Server.cpp做编码:                字符串缓冲区;

           test::Test original;
           original.set_id(0);
           original.set_name("original");

           original.AppendToString(&buffer);
           send(acceptfd,buffer.c_str(), buffer.size(),0);

通过这个发送功能,它会将数据发送到客户端,我希望我也没有收到任何错误。

但我的担心如下:

  1. 如何使用Google协议缓冲区解码上述消息 客户端
  2. 这样我就可以看到/打印消息了。

1 个答案:

答案 0 :(得分:1)

您应该发送的不仅仅是protobuf消息,以便能够在客户端解码它。

一个简单的解决方案是使用网络字节顺序将buffer.size()的值作为4字节整数发送到套接字,并发送缓冲区本身。

客户端应首先从套接字读取缓冲区的大小,并将其从网络转换为主机字节顺序。我们用结果值s表示。然后,客户端必须预先分配大小为s的缓冲区,并从套接字中读取s个字节。之后,只需使用MessageLite :: ParseFromString重建您的protobuf。

有关protobuf消息方法的更多信息,请参阅here

此外,this文件不鼓励使用required

  

您应该非常小心地根据需要标记字段。如果在   有一点你想停止写或发送一个必填字段,它   将字段更改为可选字段(旧字段)会有问题   读者会认为没有这个字段的消息是不完整的   可能会无意中拒绝或放弃它们。你应该考虑写作   缓冲区的特定于应用程序的自定义验证例程   代替。谷歌的一些工程师得出结论   使用要求弊大于利;他们更喜欢只使用   可选和重复。但是,这种观点并不普遍。