有人可以帮忙告诉我如何使用协议缓冲区。实际上我想通过在unix上运行的程序和在windows上运行的另一个程序之间的套接字交换数据,以便运行模拟研究。
使用套接字交换数据的程序是用C / C ++编写的,如果somneone可以帮助我使用协议缓冲区以便以下列形式交换数据,我会很高兴:
struct snd_data{
char *var="temp";
int var1=1;
float var2;
double var2;
}
我尝试了几种方法,但数据仍未正确交换。任何帮助将非常感激
感谢您的帮助,
答案 0 :(得分:13)
首先在.proto文件中定义消息:
package foo;
message snd_data {
required string var= 1;
required int32 var1 = 2;
optional float var2 = 3;
optional double var3 = 4;
}
(我猜浮动和双重实际上是不同的变量......)
然后使用protoc
编译它,然后你有代码实现你的缓冲区。
有关详细信息,请参阅:http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html
答案 1 :(得分:3)
您是如何将消息写入套接字的? Protobufs本身不是字节序敏感的,但protobufs也没有定义传输机制 - protobuf定义了消息和它的序列化形式(它是一个(8位)字节序列)之间的映射,它是你的< / strong>将此字节序列传输到远程主机的责任。
在我们的例子中,我们定义了一个非常简单的传输协议;首先我们将消息大小写为32位整数(大端),然后是消息本身。 (另请记住,protobuf消息不是自我识别的,这意味着您需要知道要发送的消息。这通常通过包含包装消息来管理,其中包含您想要的所有消息的可选字段有关此技术的更多信息,请参阅protobuf网站和邮件列表存档。)
答案 2 :(得分:2)
Endianess在protobuf中处理。
请参阅:
https://groups.google.com/forum/?fromgroups#!topic/protobuf/XbzBwCj4yL8
How cross-platform is Google's Protocol Buffer's handling of floating-point types in practice?
答案 3 :(得分:1)
两台机器都是x86吗?否则你需要注意big endian和little endian差异。它也值得关注结构包装。由于事实指针在不同平台上的大小不同,因此传递指针也会有问题。在你的帖子中,所有信息都太少,无法确定是什么问题......
答案 4 :(得分:0)
答案在于传输数据的结尾,这是您需要非常仔细考虑并检查的内容。查看here以显示字节序可以执行的操作,并导致数据在接收方和发送方上混乱。没有这种平滑传输数据的完美措施,只是因为从unix盒发送的数据保证了windows盒上的数据在数据的内存结构方面将处于相同的顺序。 unix盒子上的结构填充也与windows盒子上的填充不同,它归结为命令行开关的使用方式,认为结构对齐。