[英]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.