2011-09-02 165 views
2

我使用一個小緩衝區(例如128字節),我想使用「async_read_until」與TCP連接上的大傳入消息(丟棄除了最後128字節分隔符)。BOOST ASIO:如何使用有限的緩衝區大小與async_read_until

這怎麼辦? ASIO文檔不太清楚當提供的緩衝區不夠大時會發生什麼。

這裏是我讀initiazation

typedef boost::shared_ptr<boost::asio::streambuf >streambuf_ptr; 
streambuf_ptr inBuf(new boost::asio::streambuf (128)); 
boost::asio::async_read_until(*sock, *inBuf, "\r\n\r\n", boost::bind(my_read_handler, sock, inBuf, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

回答

4

當提供的緩衝區不夠大,async_read_until填充它完全,然後調用與錯誤代碼asio::error::not_found讀處理程序,這意味着分隔符碼未找到。

在這一點上,你可以從.consume()緩衝區中的一些(或全部)數據再次調用async_read_until。使用128字節的緩衝區可能很難保證,當最終找到分隔符時,它確切地位於緩衝區的最後位置(即使如此,使用四字節分隔符,也只有最後一個分隔符它之前的124個字節)。在not_found錯誤處理程序中最好使用更大的緩衝區並使用buffer.consume(buffer.size()-128),以確保始終有至少128個字節空閒。

相關問題