1. 程式人生 > >翻譯:libevent參考手冊第七章:Bufferevent:高階話題 (九) (轉)

翻譯:libevent參考手冊第七章:Bufferevent:高階話題 (九) (轉)

bufferevent_filter_new()函式建立一個封裝現有的“底層”bufferevent的過濾bufferevent。所有通過底層bufferevent接收的資料在到達過濾bufferevent之前都會經過“輸入”過濾器的轉換;所有通過底層bufferevent傳送的資料在被髮送到底層bufferevent之前都會經過“輸出”過濾器的轉換。

向底層bufferevent新增過濾器將替換其回撥函式。可以向底層bufferevent的evbuffer添加回調函式,但是如果想讓過濾器正確工作,就不能再設定bufferevent本身的回撥函式。

input_filter和output_filter函式將隨後描述。options引數支援所有通常的選項。如果設定了BEV_OPT_CLOSE_ON_FREE,那麼釋放過濾bufferevent也會同時釋放底層bufferevent。ctx引數是傳遞給過濾函式的任意指標;如果提供了free_context,則在釋放ctx之前它會被呼叫。

底層輸入緩衝區有資料可讀時,輸入過濾器函式會被呼叫;過濾器的輸出緩衝區有新的資料待寫入時,輸出過濾器函式會被呼叫。兩個過濾器函式都有一對evbuffer引數:從source讀取資料;向destination寫入資料,而dst_limit引數描述了可以寫入destination的位元組數上限。過濾器函式可以忽略這個引數,但是這樣可能會違背高水位或者速率限制。如果dst_limit是-1,則沒有限制。mode引數向過濾器描述了寫入的方式。值BEV_NORMAL表示應該在方便轉換的基礎上寫入儘可能多的資料;而BEV_FLUSH表示寫入儘可能多的資料;BEV_FINISHED表示過濾器函式應該在流的末尾執行額外的清理操作。最後,過濾器函式的ctx引數就是傳遞給bufferevent_filter_new()函式的指標(ctx引數)。

如果成功向目標緩衝區寫入了任何資料,過濾器函式應該返回BEV_OK;如果不獲得更多的輸入,或者不使用不同的清空(flush)模式,就不能向目標緩衝區寫入更多的資料,則應該返回BEV_NEED_MORE;如果過濾器上發生了不可恢復的錯誤,則應該返回BEV_ERROR。

建立過濾器將啟用底層bufferevent的讀取和寫入。隨後就不需要自己管理讀取和寫入了:過濾器在不想讀取的時候會自動掛起底層bufferevent的讀取。從2.0.8-rc版本開始,可以在過濾器之外獨立地啟用/禁用底層bufferevent的讀取和寫入。然而,這樣可能會讓過濾器不能成功取得所需要的資料。

不需要同時指定輸入和輸出過濾器:沒有給定的過濾器將被一個不進行資料轉換的過濾器取代。

bufferevent和速率限制

某些程式需要限制單個或者一組bufferevent使用的頻寬。2.0.4-alpha和2.0.5-alpha版本添加了為單個或者一組bufferevent設定速率限制的基本功能。

3.1 速率限制模型

libevent的速率限制使用記號儲存器(token bucket)演算法確定在某時刻可以寫入或者讀取多少位元組。每個速率限制物件在任何給定時刻都有一個“讀儲存器(read bucket)”和一個“寫儲存器(write bucket)”,其大小決定了物件可以立即讀取或者寫入多少位元組。每個儲存器有一個填充速率,一個最大突發尺寸,和一個時間單位,或者說“滴答(tick)”。一個時間單位流逝後,儲存器被填充一些位元組(決定於填充速率)——但是如果超過其突發尺寸,則超出的位元組會丟失。

因此,填充速率決定了物件傳送或者接收位元組的最大平均速率,而突發尺寸決定了在單次突發中可以傳送或者接收的最大位元組數;時間單位則確定了傳輸的平滑程度。

3.2 為bufferevent設定速率限制

介面