# 7 數據緩沖Bufferevent
很多時候,除了響應事件之外,應用還希望做一定的數據緩沖。比如說,寫入數據的時候 ,通常的運行模式是:
* 決定要向連接寫入一些數據,把數據放入到緩沖區中
* 等待連接可以寫入
* 寫入盡量多的數據
* 記住寫入了多少數據,如果還有更多數據要寫入,等待連接再次可以寫入
這種緩沖 IO 模式很通用,libevent 為此提供了一種通用機制,即bufferevent。
bufferevent 由一個底層的傳輸端口(如套接字 ),一個讀取緩沖區和一個寫入緩沖區組成。與通常的事件在底層傳輸端口已經就緒,可以讀取或者寫入的時候執行回調不同的是,bufferevent 在讀取或者寫入了足夠量的數據之后調用用戶提供的回調。
有多種共享公用接口的 bufferevent 類型,編寫本文時已存在以下類型:
* `基于套接字的 bufferevent`:使用 event_*接口作為后端,通過底層流式套接字發送或者接收數據的 bufferevent
* `異步 IO bufferevent`:使用 Windows IOCP 接口,通過底層流式套接字發送或者接收數據的 bufferevent(僅用于 Windows,試驗中)
* `過濾型 bufferevent`:將數據傳輸到底層 bufferevent 對象之前,處理輸入或者輸出數據的 bufferevent:比如說,為了壓縮或者轉換數據。
* `成對的 bufferevent`:相互傳輸數據的兩個 bufferevent。
>`注意`:截止2.0.2-alpha 版,這里列出的 bufferevent 接口還沒有完全正交于所有 的 bufferevent 類型。也就是說,下面將要介紹的接口不是都能用于所有bufferevent 類型。libevent 開發 者在未來版本中將修正這個問題。
>`也請注意` :當前 bufferevent 只能用于像 TCP 這樣的面向流的協議,將來才可能會支持 像 UDP 這樣的面向數據報的協議。
## bufferevent和evbuffer
每個 bufferevent 都有一個輸入緩沖區和一個輸出緩沖區 ,它們的類型都是“struct evbuffer”。 有數據要寫入到 bufferevent 時,添加數據到輸出緩沖區 ;bufferevent 中有數據供讀取的時候,從輸入緩沖區抽取(drain)數據。
evbuffer 接口支持很多種操作,后面的章節將討論這些操作。
- 封面
- 1 Libevent官方
- 2 epoll
- 2.1 流-IO操作-阻塞
- 2.2 解決阻塞死等待的辦法
- 2.3 什么是epoll
- 2.4 epollAPI
- 2.5 觸發模式
- 2.6 簡單的epoll服務器
- 3 epoll和reactor
- 3.1 reactor反應堆模式
- 3.2 epoll的反應堆模式實現
- 4 event_base
- 4.1 創建event_base
- 4.2 檢查event_base后端
- 4.3 釋放event_base
- 4.4 event_base優先級
- 4.5 event_base和fork
- 5 事件循環event_loop
- 5.1 運行循環
- 5.2 停止循環
- 5.3 轉儲event_base的狀態
- 6 事件event
- 6.1 創建事件
- 6.2 事件的未決和非未決
- 6.3 事件的優先級
- 6.4 檢查事件狀態
- 6.5 一次觸發事件
- 6.6 手動激活事件
- 6.7 事件狀態之間的轉換
- 7 數據緩沖Bufferevent
- 7.1 回調和水位
- 7.2 延遲回調
- 7.3 bufferevent 選項標志
- 7.4 使用bufferevent
- 7.5 通用bufferevent操作
- 7.5.1 釋放bufferevent操作
- 7.5.2 操作回調、水位和啟用/禁用
- 7.5.3 操作bufferevent中的數據
- 7.5.4 bufferevent的清空操作
- 8 數據封裝evBuffer
- 8.1 創建和釋放evbuffer
- 8.2 evbuffer與線程安全
- 8.3 檢查evbuffer
- 8.4 向evbuffer添加數據
- 8.5 evbuffer數據移動
- 8.6 添加數據到evbuffer前
- 8 鏈接監聽器evconnlistener
- 8.1 創建和釋放 evconnlistener
- 8.2 啟用和禁用 evconnlistener
- 8.3 調整 evconnlistener 的回調函數
- 8.4 檢測 evconnlistener
- 8.5 偵測錯誤
- 9 libevent常用設置
- 9.1 日志消息回調設置
- 9.2 致命錯誤回調設置
- 9.3 內存管理回調設置
- 9.4 鎖和線程的設置
- 9.5 調試事件的使用
- 10 基于libevent服務器
- 10.1 Hello_World服務器(基于信號)
- 10.2 基于事件服務器
- 10.3 回顯服務器
- 10.3 libevent實現http服務器