使用独立的 asio,我用 read_some 实现了一个服务器。我的服务器循环累积从套接字接收到的所有数据。下面的精简代码不能正常工作,但我可以通过将 inbuf.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);
}
当 prepare() 在循环之外并且自建立连接以来读取的总字节数越过 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() 的作用,以及为什么需要重复调用它?