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
- const_buffer 和 mutable_buffer 基本上类似于 一个 std::pair<void* , size_t > 这样一个元组(tuple),可以由 asio::buffer 转换而来(详见 自由函数buffer )
- 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