gpt4 book ai didi

c++ - boost ASIO streambuf

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:42 34 4
gpt4 key购买 nike

我对 boost asio::streambuf 类中的输入序列和输出序列感到困惑。

根据文档中的代码示例(用于发送数据),表示输入序列的缓冲区似乎用于写入套接字,而表示输出序列的缓冲区用于读取。

例子-

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 的命名法类似于 C++ 标准中定义的,并在标准模板库中跨各种类使用,其中数据写入输出流,数据从输入流读取。例如,可以使用 std::cout.put() 写入输出流,使用 std::cin.get() 从输入流读取.

手动控制streambuf输入输出序列时,数据的一般生命周期如下:

  • 缓冲区分配 prepare()用于输出序列。
  • 数据写入输出序列的缓冲区后,数据将为commit()。编辑。已提交的数据将从输出序列中移除,并附加到可从中读取的输入序列。
  • 数据从通过data()获得的输入序列的缓冲区中读取.
  • 一旦数据被读取,它就可以通过consume()从输入序列中移除。 .

当使用在 streambuf 上运行的 Boost.Asio 操作或使用 streambuf 的流对象时,例如 std::ostream,底层输入和输出序列将得到妥善管理。如果为操作提供缓冲区,例如将 prepare() 传递给读操作或将 data() 传递给写操作,则必须显式处理commit()consume()

这是示例代码的注释版本,它直接从 streambuf 写入套接字:

// The input and output sequence are empty.
boost::asio::streambuf b;
std::ostream os(&b);

// prepare() and write to the output sequence, then commit the written
// data to the input sequence. The output sequence is empty and
// input sequence contains "Hello, World!\n".
os << "Hello, World!\n";

// Read from the input sequence, writing to the socket. The input and
// output sequences remain unchanged.
size_t n = sock.send(b.data());

// Remove 'n' bytes from the input sequence. If the send operation sent
// the entire buffer, then the input sequence would be empty.
b.consume(n);

这里是从套接字直接读取到 streambuf 的注释示例。注释假定在套接字上接收到“hello”一词,但尚未读取:

boost::asio::streambuf b;

// prepare() 512 bytes for the output sequence. The input sequence
// is empty.
auto bufs = b.prepare(512);

// Read from the socket, writing into the output sequence. The
// input sequence is empty and the output sequence contains "hello".
size_t n = sock.receive(bufs);

// Remove 'n' (5) bytes from output sequence appending them to the
// input sequence. The input sequence contains "hello" and the
// output sequence has 507 bytes.
b.commit(n);

// The input and output sequence remain unchanged.
std::istream is(&b);
std::string s;

// Read from the input sequence and consume the read data. The string
// 's' contains "hello". The input sequence is empty, the output
// sequence remains unchanged.
is >> s;

注意在上面的例子中,steam 对象是如何处理提交和使用 streambuf 的输出和输入序列的。但是,当使用缓冲区本身时(即 data()prepare()),代码需要显式处理提交和使用。

关于c++ - boost ASIO streambuf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31960010/

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