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

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