使用独立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