如何在 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
我是 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