提问者:小点点

如何在Boost::ASIO中将打包结构作为消息传递? (不序列化)


我是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; 

共1个答案

匿名用户

如果您的意思是“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));

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

  • 使用Boost的TCP零复制
  • 如何在boost.asio中使用零副本sendmsg/receive