【问题标题】:Packing struct in Boost Asio buffer在 Boost Asio 缓冲区中打包结构
【发布时间】:2014-05-17 03:01:10
【问题描述】:

我正在寻找一种通过带有 Boost Asio 的套接字发送由自定义数据结构组成的数据包的方法。目前我知道您可以使用标准 boost asio 缓冲区发送一个字符串(在 boost::asio::write(..) 方法中)。

例如,是否可以将数据从填充的结构发送到服务器或客户端?如果是,我需要怎么做,因为我找不到有关此的文档。

【问题讨论】:

  • @AndrewBarber lol @ 结束这个问题 - 我不完全同意它本身太宽泛(毕竟它被标记为 boost-asio,并提到他知道如何使用 boost asio @987654322 @)。我的答案链接到他找不到的文档部分。但是我看到了您缺少的内容-上下文和示例代码:)
  • @sehe 嗯...当然,我明白了。重新开放!

标签: c++ boost boost-asio


【解决方案1】:

这里有一些对我有用的例子:

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);
}

【讨论】:

    【解决方案2】:

    您可以按位复制 POD 对象。

    事实上,只要 T 是 POD 结构,Asio 就接受 boost/std array&lt;T, N&gt;、T[] 或 vector&lt;T&gt; 缓冲区。

    否则,您可以使用 Boost 序列化来序列化您的数据。

    最后,Boost Spirit 对二进制文件(二进制 dwords (big-endian/little-endian)、二进制浮点数)提供了一些支持。

    更新示例:

    #include <memory>
    #include <boost/asio.hpp>
    
    int main()
    {
        struct { float a, b; } arr[10];
    
        auto mutable_buffer = boost::asio::buffer(arr);
    }
    

    看Live On Coliru

    【讨论】:

    • 那么例如我可以使用新创建的结构作为缓冲区吗?如果我有以下情况:struct { float pos; float pos2; }
    • 那么,是否可以直接说:n bytes from pointer p?还是该副本是强制性的?
    • 如果使用boost::asio::buffer(...),则没有副本。 EDIT 在 coliru 上添加了一个示例
    【解决方案3】:

    您也可以为此目的使用协议缓冲区,配置起来并不困难

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

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2016-09-19
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多