我是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(标准层,可构造/可破坏),简而言之,是可按位序列化的,那么您可以说您的struct是一个缓冲区。
实际上,您可能决定不需要复制到另一个缓冲区/表示中并使用该缓冲区。 这很简单,只需将对象调整为缓冲区即可:
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));
这种按位序列化是不可移植的。 我假设你很清楚这一点,并不介意。