c++ - 如何在boost::asio中将打包的结构作为消息传递? (不进行序列化)

标签 c++ sockets boost struct boost-asio

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

警告

这种按位序列化是不可移植的。我假设您对此很清楚,也不会介意。

奖金链接
  • TCP Zero copy using boost
  • How to use Zero-copy sendmsg/Receive in Boost.Asio
  • 关于c++ - 如何在boost::asio中将打包的结构作为消息传递? (不进行序列化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62216880/

    相关文章:

    c++ - 如果我将一个参数放入默认构造函数中,但给该参数一个默认值,它仍然是一个默认构造函数吗?

    即使在对等方挂断后,poll() 也能返回 POLLIN 事件吗?

    c++ - boost::signals2 仍然向引用死亡的对象发出信号

    c++ - 我应该让 QFile (或 fstream)保持打开状态吗?

    c++ - Clang 与 GCC : Single-colon in Enum usage

    Java 和 JavaFX 安全

    c - TCP 上的可变长度消息

    c++11 - 自旋锁实现推理

    c++ - 链接错误 : ambiguous libboost*. lib 与 boost*.lib

    c++ - 如何编译静态链接除一个库之外的所有库 (G++)