如何在 boost::asio 中将打包结构作为消息传递? (没有序列化)

How to pass packed structs as messages in boost::asio? (without serialization)

我是 boost::asio,消息和响应都是打包结构的形式,由于结构是打包的,所以我在这里看不到序列化的使用。 我看过类似的问题和所有建议连载,但这不是我要找的。我们如何通过 tcp 连接 boost::asio 传递和接收这些结构的对象?我是 boost 的新手,只是在探索它,所以代码示例会有很大帮助。提前致谢。

示例结构:

typedef struct { 
    MessageHeaderInComp MessageHeaderIn;
    RequestHeaderComp RequestHeader;
    uint32_t Username;
    char Password[LEN_PASSWORD];
    char Pad4[LEN_PAD4];


} __attribute__((packed)) UserLoginRequest; 

如果你的意思是 "packed struct" 实际上是 POD(所以标准布局和平凡的 constructible/destructible),简而言之按位序列化,那么你可以说你的结构 缓冲区。

事实上,您可能决定不需要复制到另一个 buffer/representation 并使用缓冲区。很简单,就是 adapt your object as a buffer:

UserLoginRequest req;
write(socket_or_stream, boost::asio::buffer(&req, sizeof(req)));
read(socket_or_stream, boost::asio::buffer(&req, sizeof(req)));

为了避免计算,我更喜欢使用数组声明:

UserLoginRequest req[1];
write(socket_or_stream, boost::asio::buffer(req));
read(socket_or_stream, boost::asio::buffer(req));

当然在异步流或套接字上也可以使用 async_* 变体(鉴于 缓冲区的生命周期一如既往地延长到操作完成).

更多

相关,可以连续存储POD类型作为缓冲区:

std::vector<UserLoginRequest> massLogin(123); // weird, but just for demo
write(socket_or_stream, boost::asio::buffer(massLogin));
read(socket_or_stream, boost::asio::buffer(massLogin));

警告

这种按位序列化是不可移植的。我假设你很清楚这一点并且不介意。

奖励链接

  • TCP Zero copy using boost