簡體   English   中英

動態大小的boost :: asio :: buffer

[英]Dynamically sized boost::asio::buffer

我正在從boost::asio::ip::udp::socket讀取,如下所示:

using boost::asio::ip::udp;

// ...

char recv_buf[128];
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);

現在,這可以正常工作,但是我現在可以接收的最大字符數為127。但是,我遇到了一個問題,因為我需要接受一些長度可能會發生很大變化的數據輸入(而且效果不佳)定義的長度(例如帶有前綴標頭)。 一種解決方案是動態擴展緩沖區,例如向量。 是否可以創建一個動態擴展的boost::asio::buffer來接受(理論上)無限量的輸入並將其存儲在容器中?

UDP數據報的大小並沒有太大變化:它永遠不會大於65535 ,在8字節標頭之后留出65,527字節數據的空間。

如果使用較小的緩沖區,則可以通過* BufferSequences概念輕松地將它們鏈接在一起。 例如,你可以在一傳MutableBufferSequence從讀(2)調用接受的數據,或通過ConstBufferSequence為緩沖區,你打算寫(2)出的列表。 也就是說,我傾向於建議在每個方向上使用單個緩沖區,因為它傾向於簡化代碼(盡管並非總是可能的)。

Boost 1.66.0添加了dynamic_buffer ,可以適應對std::stringstd::vector<CharType>的引用:

似乎沒有任何關於動態調整大小的規定。 這是有道理的。 想想會發生什么:

  • 單個UDP數據報只能一次接收一次,因此:
  • 給低級系統調用的緩沖區必須足夠大以容納最大的有效消息,因此,
  • 為了提高效率,緩沖區必須由調用方預先分配。

因此,沒有可用的動態大小的緩沖區是沒有意義的。 正如Cubbi所指出的那樣,UDP數據報的最大大小反而很小,因此只要使緩沖區大小與系統中最大的有效消息一樣大,然后對其進行處理即可。

暫無
暫無

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

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