使用獨立asio,我使用read_some實現了一個服務器。我的服務器循環會從套接字中累積所有收到的數據。下面的精簡代碼不能正常工作,但我可以通過將inbuf.prepare()語句移入循環來修復它。asio streambuf可變緩衝區類型 - 如何使用prepare()
asio::streambuf inbuf;
asio::streambuf::mutable_buffers_type inbufs = inbuf.prepare(4096);
while(connected)
{
asio::error_code ec;
size_t bytes_read = Socket().read_some(inbufs,ec);
inbuf.commit(bytes_read);
std::string s = std::string(asio::buffers_begin(inbufs),
asio::buffers_begin(inbufs) + inbuf.size());
inbuf.consume(bytes_read);
}
當製備()是環路和讀由於連接用4096邊界建立的雜交的總字節數之外,字符串s只會有數據到該邊界。換句話說,s將比bytes_read短。我推測如果我想在循環之外保留prepare(),我需要像下面這樣的消耗循環,但是這也不起作用。
asio::streambuf inbuf;
asio::streambuf::mutable_buffers_type inbufs = inbuf.prepare(4096);
while(connected)
{
asio::error_code ec;
size_t bytes_read = Socket().read_some(inbufs,ec);
while(bytes_read > 0)
{
inbuf.commit(bytes_read);
std::string s = std::string(asio::buffers_begin(inbufs),
asio::buffers_begin(inbufs) + inbuf.size());
inbuf.consume(inbuf.size());
bytes_read -= s.size();
}
}
任何人都可以澄清prepare()的作用,爲什麼需要重複調用它?
在我的情況下,我可以估計在讀取第一個數據塊後預期的總數據大小,因此我可以調用cumulative_data.reserve()以避免頻率存儲器重新分配。 – edj