使用boost :: asio发送Protobuf消息

adi*_*i64 11 c++ networking boost protocol-buffers boost-asio

我试图使用Google的Protocol Buffers和boost :: asio在C++中一起破解客户端.

我的问题是我不知道如何将protobuf消息提供给asio.我有的是这个:

// set up *sock - works
PlayerInfo info;
info.set_name(name);
// other stuff
Run Code Online (Sandbox Code Playgroud)

现在我知道以下是错误的,但我会发布它:

size_t request_length = info.ByteSize();
boost::asio::write(*sock, boost::asio::buffer(info, request_length));
Run Code Online (Sandbox Code Playgroud)

我知道我必须以不同的方式将我的信息打包到缓冲区 - 但是如何?

一般来说,我很难搞清楚boost :: asio是如何工作的.有一些教程,但它们通常只包括发送标准数据格式,如ints,它是开箱即用的.我认为我的问题是序列化,但另一方面我了解到protobuf应该为我做这个......现在我很困惑;)

谢谢你的帮助!

- > Daniel Gehriger提供了解决方案,非常感谢!

Dan*_*ger 10

我对Google的协议缓冲区了解不多,但请尝试以下方法:

PlayerInfo info;
info.set_name(name);
// ...

boost::asio::streambuf b;
std::ostream os(&b);
info.SerializeToOstream(&os);

boost::asio::write(*sock, b);
Run Code Online (Sandbox Code Playgroud)

  • 您需要向流中添加更多信息,以便可以在另一端可靠地读取PlayerInfo对象.Protobuf不会直接在流中嵌入对象类型.我不认为它包含长度,但我必须检查文档.BTW,ASIO不了解物体; 它只处理字节.阅读示例和文档时请记住这一点. (5认同)
  • 大小前缀数据包是每个人在网络通信中首先尝试的方法,并且当世界干净时它就会起作用。但请注意,如果您需要重新同步流(即您不确定自己在哪里),它不会让您摆脱麻烦。这就是为什么健壮的协议通常依赖于分隔符,尽管有转义的麻烦。 (2认同)