簡體   English   中英

使用 boost asio 發送數據包對象

[英]Sending Packet objects with boost asio

采取以下措施:

struct Header{
    std::size_t body_size;
};
struct Body{
    std::string data;
};
struct Packet{
    Header header;
    Body body;


};

現在假設我想通過tcp套接字發送一個Packet對象。

為此,我想將 Header 序列化為std::string ,其中包含有關body大小的信息,並通過套接字發送該string

但是這個序列化頭字符串本身具有可變大小,因為body_size不是固定的,所以我怎么知道要讀取多少字節(序列化頭字符串)

那么在發送這樣的數據時使用什么樣的協議呢?

像您提議的那樣,通過TCP套接字發送數據的最常用協議是HTTP
HTTP ,正文大小作為相關標頭 [請求、響應或塊] 中的字符串發送,並帶有特殊字符( \\r\\n表示請求或響應, ;表示塊)以標識大小字符串的結尾。
你需要決定自己的特殊性格; NULL將是最簡單的空終止字符串。

按照您的建議發送數據的關鍵問題之一是, TCP可以將數據拆分為多個(通常稱為) packets ,因此接收方可能無法一次收到您的整個Packet
BTW Packet在這種情況下是一個糟糕的名字。

在發送之前,您無需知道完整Packet的大小。 您可以使用const_buffer的集合調用boost:asio async_write以發送PacketHeaderBody

在接收端,我建議使用async_read_some和一個足夠大的string緩沖區來容納整個Packet包括Header字符串。
您應該能夠從NULL之前的字符中讀取Body大小,並根據Body大小加上NULL + 1 之前的字符數(對於NULL )計算您的Packet大小。 如果這小於您的ReadHandler報告的大小,則您的Body已被拆分為多個TCP packets ,因此您需要接收其他packets以重建您的Packet Body

或者,您可以省去麻煩,只需使用久經考驗的HTTP庫,如via-httplibboost::beast

暫無
暫無

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

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