boost asio 中各种buffer

buffer 的种类

boost asio中的buffer 种类可以分为 const buffer、 mutable buffer、sream buffer
另外还有 const_buffer_sequence mutable_buffer_sequence

自由函数有 buffer 、 dynamic_buffer 。

const_buffer mutable_buffer

  1. const_buffer 和 mutable_buffer 基本上类似于 一个 std::pair<void* , size_t > 这样一个元组(tuple),可以由 asio::buffer 转换而来(详见 自由函数buffer )
  2. mutable_buffer 可以隐式 转换成 const_buffer ,但是反之却不 亦然。

const/mutable buffer sequence

在IO的读写操作中,会涉及到数据的发散-收敛 操作:

读的时候 ,事先不知道数据的大小,只能先申请一块固定大小的内存,把数据填充到其中,不够的话再申请一块固定大小的内存,再填充数据。。。, 直到读完为止。 是为发散(scatter)
写数据正好相反,可以把多块内存中的数据写到IO 里面,称为收敛(gather )

为此,asio 设计了一种buffer_sequence ,来完成这种操作。
对于 mutable_buffer_sequence, 其包含多个 mutable_buffer, 可以通过迭代器依次便利。
对于 const_buffer_sequence ,也类似。

stream_buffer

stream_buf 继承自 std:: std::basic_streambuf,用来关联输入流 和 输出流的。
具体用法 详见 std::basic_streambuf

大概内存模型
input output end
(dst_data) << |___________|_____________| << (src_data )

  • 首先,对于 asio 的read 函数来说 ,可以通过 prepare() 函数获取获取streambuf 的output sequence , 该 sequence 符合 MutableBufferSequence 的特性(traits)
  • 当read 完毕之后,可以调用 commit() 函数,把数据从output sequence 提交到input sequence。
  • 对于想要处理这段数据的 模块,可用调用 data() 方法,该方法返回一个 ConstBufferSequence 。
  • 处理完毕之后 ,可以调用consume 把这段数据从 input sequence 的头部移除。

dynamic_buffer

上述的 stream_buffer 大小是固定的,dynamic_buffer 是 stream_buffer的 concept 的扩展。
dynamic_buffer 之与stream_buffer,就像 array 之与 vector。

BYW: 所有的 istream 和 ostream 都是代理模式,所有的 buffer 也是。

自由函数buffer 与 dynamic_buffer

buffer

buffer 可以把 vector, std::array ,裸内存指针  转化为 dynamic buffer或者 const buffer

注意 const buffer ,也符合 const buffer sequence 的定义
buffer(vector v),buffer 的大小是 v.size

dynamic_buffer

dynamic_buffer () 是把一个 vector 转化成 一个 dynamic_buffer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章