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