gpt4 book ai didi

c++ - 我什么时候调用 boost::asio::streambuf::consume() 和 boost::asio::streambuf::commit()?

转载 作者:可可西里 更新时间:2023-11-01 16:39:52 26 4
gpt4 key购买 nike

我试图理解 boost::asio::streambuf::consume()boost::asio::streambuf::commit() 调用.在文档中,我们有示例,

boost::asio::streambuf b;
std::ostream os(&b);
os << "Hello, World!\n";

// try sending some data in input sequence
size_t n = sock.send(b.data());

b.consume(n); // sent data is removed from input sequence

boost::asio::streambuf b;

// reserve 512 bytes in output sequence
boost::asio::streambuf::mutable_buffers_type bufs = b.prepare(512);

size_t n = sock.receive(bufs);

// received data is "committed" from output sequence to input sequence
b.commit(n);

std::istream is(&b);
std::string s;
is >> s;

我对这两个调用的理解与我对文档对它们的理解一样多 - 调用 consume() 以从 boost::asio::streambuf 中的输入序列中删除字符,并调用 commit() 将字符从 boost::asio::streambuf 的输出序列移动到它的输入序列。很公平。

我什么时候实际上调用这些?查看 boost::asio::read_until() 源代码,我们有

template <typename SyncReadStream, typename Allocator>
std::size_t read_until(SyncReadStream& s,
boost::asio::basic_streambuf<Allocator>& b, char delim,
boost::system::error_code& ec)
{
std::size_t search_position = 0;
for (;;)
{
// Determine the range of the data to be searched.
typedef typename boost::asio::basic_streambuf<
Allocator>::const_buffers_type const_buffers_type;
typedef boost::asio::buffers_iterator<const_buffers_type> iterator;
const_buffers_type buffers = b.data();
iterator begin = iterator::begin(buffers);
iterator start_pos = begin + search_position;
iterator end = iterator::end(buffers);

// Look for a match.
iterator iter = std::find(start_pos, end, delim);
if (iter != end)
{
// Found a match. We're done.
ec = boost::system::error_code();
return iter - begin + 1;
}
else
{
// No match. Next search can start with the new data.
search_position = end - begin;
}

// Check if buffer is full.
if (b.size() == b.max_size())
{
ec = error::not_found;
return 0;
}

// Need more data.
std::size_t bytes_to_read = read_size_helper(b, 65536);
b.commit(s.read_some(b.prepare(bytes_to_read), ec));
if (ec)
return 0;
}
}

你可以看到,正如文档所说,boost::asio::read_until() 是根据 SyncReadStreamread_some() 实现的

对我来说,就是这样

  1. SyncReadStream::read_some() 不调用 boost::asio::streambuf::commit()
  2. boost::asio::read_until() 会调用 boost::asio::streambuf::commit()
  3. 这些似乎都没有记录 - boost::asio::read_until() 的文档和 SyncReadStream 的文档都没有。
  4. 我根本不知道我是否应该调用 boost::asio::streambuf::commit()

对于我的同步代码,我当然似乎不需要它,而不是在我调用自由函数 boost::asio::read()boost::asio 时::read_until()。我在我的处理程序的异步代码中有它,主要是因为我使用的示例有它,但我也不确定是否要调用它。当我尝试将 boost::asio::streambufstringstreamstd::string 一起使用时, 提交() 似乎没有发挥作用 - 如果不调用 streambuf 上的 commit(),任何事情都不会停止或卡住。

谁能帮我解决这个问题?

最佳答案

Asio 定义了一些auxiliary free functions (read_xxx)接受asio::streambuf,他们关心准备提交

另一方面,如果您想将 asio::streambuflower-level functions 一起使用接受 MutableBufferSequence concept 的模型,你必须调用 streambuf::prepare(),它返回一个符合 MutableBufferSequence 概念的对象,将这个对象作为缓冲区传递,并在函数填充它之后 - 调用提交()。

在这两种情况下,当您从 streambuf 中读取了 n 字节的数据后,您必须调用 consume(n) -为了消耗输入序列。

关于c++ - 我什么时候调用 boost::asio::streambuf::consume() 和 boost::asio::streambuf::commit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325843/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com