簡體   English   中英

如何在 boost::asio 中將打包結構作為消息傳遞? (無序列化)

[英]How to pass packed structs as messages in boost::asio? (without serialization)

我是 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(因此是標准布局並且可以簡單地構造/可破壞),簡而言之是按位可序列化的,那么您可以說您的結構一個緩沖區。

實際上,您可能決定不需要復制到另一個緩沖區/表示並使用該緩沖區。 這很簡單,只需將您的 object 調整為緩沖區

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

當然,在異步流或 sockets 上,也可以使用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));

警告

這種按位序列化是不可移植的。 我假設你很清楚這一點並且不介意。

獎勵鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM