我是boost::asio,消息和响应都是打包结构的形式,而打包结构时,我在这里看不到序列化的用法。 我已经看到了类似的问题和所有建议序列化,但这不是我想要的。我们如何通过TCP连接boost::asio传递和接收这些结构的对象?我是新手,只是探索它,因此代码示例将有很大帮助。提前致谢。
示例结构:
typedef struct {
MessageHeaderInComp MessageHeaderIn;
RequestHeaderComp RequestHeader;
uint32_t Username;
char Password[LEN_PASSWORD];
char Pad4[LEN_PAD4];
} __attribute__((packed)) UserLoginRequest;
最佳答案
如果您是说“打包的结构”实际上是POD(所以是标准布局的,并且是可构造/可分解的),简而言之是按位可序列化的,那么您可以说您的结构是缓冲区。
确实,您可能决定不需要复制到另一个缓冲区/表示中并使用该缓冲区。很简单,只是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));
警告
这种按位序列化是不可移植的。我假设您对此很清楚,也不会介意。
奖金链接
关于c++ - 如何在boost::asio中将打包的结构作为消息传递? (不进行序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62216880/