我正在寻找一种方法,通过一个带有Boost Asio的套接字来发送由自定义数据结构组成的数据包。目前我明白你可以用标准的boost asio缓冲区发送一个字符串(在boost :: asio :: write(..)方法中)。在Boost Asio缓冲区中封装结构
是否可以将填充的结构中的数据发送到服务器或客户端?如果是的话,我该如何做,因为我找不到这方面的文件。
我正在寻找一种方法,通过一个带有Boost Asio的套接字来发送由自定义数据结构组成的数据包。目前我明白你可以用标准的boost asio缓冲区发送一个字符串(在boost :: asio :: write(..)方法中)。在Boost Asio缓冲区中封装结构
是否可以将填充的结构中的数据发送到服务器或客户端?如果是的话,我该如何做,因为我找不到这方面的文件。
您可以按位复制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);
}
因此,例如我可以使用新创建的结构作为缓冲区?如果我有以下几点:'struct {float:{pos_l;}}; float pos2; }' – Dries
那么,有可能直接说:从指针p的n个字节?或者是该复制是强制性的? – Deduplicator
如果使用'boost :: asio :: buffer(...)',则没有副本。 **编辑**在coliru上添加了一个实例 – sehe
您还可以使用协议缓冲区用于这一目的,并不难在配置
这里一些适用于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);
}
@AndrewBarber笑@关闭了这个问题 - 我不完全同意这太宽泛本身(它的标记[标签:升压ASIO]毕竟,并提到他知道如何使用_boost ASIO' buffer'_)。我的答案链接到他无法找到的文档部分。但我看到你缺少的东西 - 上下文和示例代码:) – sehe
@sehe嗯......当然,我明白了。重启! –