I'm trying to hack a client together in C++ using Google's Protocol Buffers and boost::asio.
My problem is that I don't know how I can feed the protobuf message to asio. What I have is this:
// set up *sock - works
PlayerInfo info;
info.set_name(name);
// other stuff
Now I know that the following is wrong, but I'll post it anyways:
size_t request_length = info.ByteSize();
boost::asio::write(*sock, boost::asio::buffer(info, request_length));
I got as far as that I know that I have to pack my message differently into the buffer - but how?
Generally speaking, I'm having a hard time figuring out how boost::asio works. There are some tutorials, but they normally just cover sending standard data formats such as ints, which works out-of-the-box. I figured that my problem is serialization, but on the other hand I learned that protobuf should do this for me... and now I'm confused ;)
Thanks for your help!
--> Daniel Gehriger provided the solution, thanks a lot!
I don't know much about Google's Protocol buffer, but try the following:
I've just started using Google Protocol Buffers (protobuf) and also had problems sending (and receiving) messages over a computer network.
In contrast to the Java API, the C++ API does not have a
writeDelimitedTo
method to send a protobuf message with a delimiter. Without a delimiter we also have to send the size of the message, to be able to de-serialize it at the receive endpoint.The C++ API offers the class
::google::protobuf::io::CodedOutputStream
, defined in the header filegoogle/protobuf/io/coded_stream.h
.The following source code demonstrates how-to send a delimited protobuf message via Boost.Asio over the wire. The example uses UDP. Since I haven't found a working example on the WWW, I share it here.
While writing this article, I've also discovered the following two questions:
Both are related to this question and also contain (partial) answers. I hope my answer may be useful anyway.