2014-04-04 32 views
5

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

是否可以将填充的结构中的数据发送到服务器或客户端?如果是的话,我该如何做,因为我找不到这方面的文件。

+0

@AndrewBarber笑@关闭了这个问题 - 我不完全同意这太宽泛本身(它的标记[标签:升压ASIO]毕竟,并提到他知道如何使用_boost ASIO' buffer'_)。我的答案链接到他无法找到的文档部分。但我看到你缺少的东西 - 上下文和示例代码:) – sehe

+0

@sehe嗯......当然,我明白了。重启! –

回答

5

您可以按位复制POD对象。只要T是POD结构,Asio就接受boost/std array<T, N>T[]vector<T>缓冲区。

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

最后,在Boost Spirit中有一些支持二进制文件(二进制双字(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

+0

因此,例如我可以使用新创建的结构作为缓冲区?如果我有以下几点:'struct {float:{pos_l;}}; float pos2; }' – Dries

+0

那么,有可能直接说:从指针p的n个字节?或者是该复制是强制性的? – Deduplicator

+0

如果使用'boost :: asio :: buffer(...)',则没有副本。 **编辑**在coliru上添加了一个实例 – sehe

0

这里一些适用于m的例子E:

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); 
} 
相关问题