我正在实现一个TCP服务器,使用asio socket.async_read()和boost :: asio :: async_read_until()方法来异步读取socket中的数据。两者都使用相同的处理程序从boost :: asio :: streambuf中读取数据。
通过async_read()调用的处理程序完美地工作:
void handle_read(const boost::system::error_code& ec, std::size_t ytes_transferred) )
{
m_request_buffer.commit(bytes_transferred);
boost::asio::streambuf::const_buffers_type rq_buf_data = m_request_buffer.data();
std::vector<uint8_t> dataBytes(boost::asio::buffers_begin(rq_buf_data), boost::asio::buffers_begin(rq_buf_data) + bytes_transferred);
//process data here
m_request_buffer.consume(bytes_transferred);
bytes_transferred = 0;
}
根据数据处理情况,我的服务器可能会关闭连接或继续通过同一套接字读取。
但是,如果handle_read()从第二个boost::asi::async_read_until()调用中调用,则在dataBytes中会得到许多零,然后才会出现有效数据。
我尝试了一个简单的测试案例,并发现在向streambuf写入数据并commit()+consume()之后,streambuf中的数据仍保留以前的缓冲区。
那么,在boost::asio::async_read_until()中有没有清除boost::asio::streambuf中的数据并重用它的方法?
如果使用USE_STREAM=1编译,则实时示例可以正常工作。但是std::istream与缓冲区consume()有何不同?
buffer.consume(buffer.size() + 1)
,因为这能够保证完全清空缓冲区。 - user562566buffer.consume
的最佳实践是使用boost::asio::async_read*
的返回值。例如:size_t bytes = boost::asio::async_read_until()
和buffer.consume(bytes)
。 - PStarczewski