Packing struct in Boost Asio buffer

无人久伴 提交于 2019-12-01 17:57:48

问题


I'm looking for a way to send a packet made of a custom data structure through a socket with Boost Asio. At the moment I understand that you can send a string with the standard boost asio buffer (in the method boost::asio::write(..) ).

Is it possible to, for example, send the data from a filled in struct to the server or to a client? If yes, how do I need to do that because I can't find documentation about this.


回答1:


You can just copy POD objects bitwise.

In fact, Asio accepts boost/std array<T, N>, T[] or vector<T> buffers as long as T is a POD struct.

  • http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/overview/core/buffers.html
  • http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/buffer.html for the various constructors for mutable/const buffer sequence wrappers.

Otherwise, you could use Boost Serialization to serialize your data.

Finally, there's some support for binaries (binary dwords (big-endian/little-endian), binary floats) in Boost Spirit.

Update Example:

#include <memory>
#include <boost/asio.hpp>

int main()
{
    struct { float a, b; } arr[10];

    auto mutable_buffer = boost::asio::buffer(arr);
}

See it Live On Coliru




回答2:


You can also use Protocol Buffers for that purpose, not hard in configuring

https://code.google.com/p/protobuf/




回答3:


here is some example which works for me:

void callback(STRUCT_A& s)
{
  f_strand.post(boost::bind(f, boost::asio::buffer(&s, sizeof(s))));
}

void f(boost::asio::mutable_buffers_1 v)
{
  STRUCT_A *a = boost::asio_buffer_cast<STRUCT_A*>(v);
}


来源:https://stackoverflow.com/questions/22868875/packing-struct-in-boost-asio-buffer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!