[英]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以發送Packet
的Header
和Body
。
在接收端,我建議使用async_read_some和一個足夠大的string
緩沖區來容納整個Packet
包括Header
字符串。
您應該能夠從NULL
之前的字符中讀取Body
大小,並根據Body
大小加上NULL
+ 1 之前的字符數(對於NULL
)計算您的Packet
大小。 如果這小於您的ReadHandler報告的大小,則您的Body
已被拆分為多個TCP
packets
,因此您需要接收其他packets
以重建您的Packet
Body
。
或者,您可以省去麻煩,只需使用久經考驗的HTTP
庫,如via-httplib或boost::beast 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.