[英]boost::asio problem passing dynamically sized data to async handler
[英]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::string
或std::vector<CharType>
的引用:
似乎沒有任何關於動態調整大小的規定。 這是有道理的。 想想會發生什么:
因此,沒有可用的動態大小的緩沖區是沒有意義的。 正如Cubbi所指出的那樣,UDP數據報的最大大小反而很小,因此只要使緩沖區大小與系統中最大的有效消息一樣大,然后對其進行處理即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.