反應器組件 ACE_Reactor

6.1 反應器組件 ACE_Reactor

反應器的基本原理是:
?針對關心的某個事件寫一個事件處理器(event_handler). 將該事件處理器登記到反應器中(同時指明關心的事件).?
?然后反應器會自動檢測事件的發生. 并調用預先登記的事件處理器中的回調函數.
?

所以ACE Reactor 框架的責任:

1、檢測來自各種事件源的事件的發生。

2、將事件多路分離給其預先登記的事件處理器。

3、分派給處理器所定義的掛鉤方法,從而以一種應用定義的方式處理這些事件。


6.2 事件處理器

在ACE中.?反應器是ACE_Reactor類的單件對象(因為程序中通常只需要一個反應器).?
反應器提供了登記/撤銷 事件處理器的接口.?register_handler() /?remove_handler() .
這些接口要求 事件處理器必須是?ACE_Event_Handler?類型的. 所以我們的事件處理器類必須從該類繼承.

在ACE_Event_Handler類中定義了一些類似?"handle_***" 的回調方法. 我們必須在派生類中重寫我們敢興趣的.?
在反應器需要檢測某個I/O句柄上是否有事件時. 需要知道原始句柄. 這樣就需要重寫事件處理器類的get_handle()函數.??
下邊是ACE_Event_Handler 中聲明的鉤子函數:
handle_signal ()??當在反應器上登記的信號發生時. 反應器回調該函數. (不懂)
handle_input ()??當來自I/O設備的輸入可用時. 反應器自動回調該方法.?
handle_exception () ?當在反應器上登記的異常事件發生時. (不懂)
handle_timeout ()?當在反應器上登記的定時器超時的時候. 回調該方法.
handle_output ()??當在IO設備上的輸出可用時. 回調該方法.
6.2.1 登記事件處理器
使用 ACE_Reactor 類的?register_handler()?函數. ? 這個函數有好幾個重載形式. ?
該函數有個參數用來指出感興趣的事件. 它可以是下邊一些常量 (定義在ACE_Event_handler類中):
READ_MASK ?? 句柄上有數據可讀時 ? 回調 handle_input()
WRITE_MASK ?? 句柄上可寫時 ? 回調 handle_output()
TIMER_MASK ??回調 handle_close()? 不懂怎么用...
ACCEPT_MASK ?? 有來自客戶端的新的連接請求時 ? 回調 handle_input()
CONNECT_MASK ? 建立連接時 ? 回調 handle_input()
DONT_CALL ?? 它用在顯式拆除事件處理器的remove_handler()函數中. 表示拆除前不調用 handler_close() 函數.

6.2.2 拆除事件處理器
當不在需要處理某個事件時. 需要把對應的事件處理器從反應器中拆除.?
兩種拆除事件處理器的辦法:
?一種是隱式的自動拆除.?當事件處理器類中的 handle_*** 方法返回的int 小于0 時. 反應器會自動調用事件處理器
??的Handle_close()方法. 并把事件處理器拆除.?
?另一種是顯式拆除. 即調用 ACE_reactor::remove_handler(). 這也會調用事件處理器的handle_close(). 然后拆除.
??不過. 如果你不需要調用handle_close(). 可以給remove_handler()傳遞參數 ACE_Event_Handler::DONT_CALL .
??具體例子在后邊會給出.


我在這里創建了一個簡單的Event_handler:

class Event_Handler
{
public:
Event_Handler();
virtual ~Event_Handler();
public:
//! 獲取反應器
//! @return 反應器指針
Reactor* reactor();
//! 設置反應器
//! @param reactor 反應器指針
void reactor(Reactor* reactor);
//! 獲取通道id
//! @return 通道id
virtual uint32_t get_id() = 0;
//! 獲取socket句柄
//! @return socket句柄
virtual SOCKET get_handle() = 0;
//! 處理讀
//! @return 處理結果 0:處理正常, -1: 連接被關閉, -2:連接異常
virtual int handle_input() = 0;
//! 處理寫
//! @return 處理結果 0:處理正常, -1: 連接被關閉, -2:連接異常
virtual int handle_output() = 0;
//! 連接異常
virtual int handle_exception() = 0;
//! 連接關閉
virtual int handle_close() = 0;
//! 超時
virtual int handle_timeout() = 0;
//! 提交發送任務
//! @param send_task 待發送的任務
virtual int post_packet(Net_Packet *send_packet) = 0;
public:
list_head hashitem;
bool read;
bool write;
bool notify_close;
time_t timeout; //<! 超時的時間, 0表示沒有設置超時
private:
//! 反應器
Reactor *m_reactor;
};

然后創建對應的處理類:

//! @class SOCK_Acceptor
//! @brief tcp監聽處理類
class SOCK_Acceptor : public Event_Handler{

...

};

//! @class SOCK_Connector
//! @brief tcp連接處理類
class SOCK_Connector : public Event_Handler{

...

};

//! @class SOCK_Stream
//! @brief tcp通道處理類
class SOCK_Stream : public Event_Handl{

...

};


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++(17)--詳解const

詳解const《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------1.const修飾成員變量 2.const修飾函數參數 3.c…

cppcheck的安裝和使用

首先從這里下載linux版本的:http://sourceforge.net/projects/cppcheck/files/cppcheck/ 然后下載對應的版本,解壓,之后安裝: 編譯: g++ -o cppcheck -Ilib cli/*.cpp lib/*.cpp 安裝: make install

leetcode24 兩兩交換鏈表中的節點

給定一個鏈表&#xff0c;兩兩交換其中相鄰的節點&#xff0c;并返回交換后的鏈表。 你不能只是單純的改變節點內部的值&#xff0c;而是需要實際的進行節點交換。 示例: 給定 1->2->3->4, 你應該返回 2->1->4->3. 思路&#xff1a;這一看就是個遞歸定義&…

再議指針和引用的一些事情吧

關于指針和引用一直是學習C++的同學們爭論的焦點,什么時候用指針,什么時候用引用,還有怎么引用數組,這么用指針訪問數組,以及初始化的問題。 不過有一些文章我在很早就已經寫過,但是由于當時時間不充分,自己也都是隨性寫的,可以參看以前我的一個文章:http://blog.csd…

C++(18)--復制構造函數

復制構造函數《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------包裝基本類&#xff0c;封裝一些算法。 需求…

lua與C++粘合層框架

一. lua調用C 在lua中是以函數指針的形式調用函數, 并且所有的函數指針都必須滿足如下此種類型: typedef int (*lua_CFunction) (lua_State *L);   也就是說, 偶們在C中定義函數時必須以lua_State為參數, 以int為返回值才能被Lua所調用. 但是不要忘記了, 偶們的lua_State是…

leetcode147 對鏈表進行插入排序

丟人&#xff0c;我就是按插入排序老老實實寫的啊。。。。 別人肯定map了hhh。 對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始&#xff0c;該鏈表可以被認為已經部分排序&#xff08;用黑色表示&#xff09;。 每次迭代時&#xff0c;從輸入數據中移除一個…

PaperNotes(13)-Conditional Image Generation with PixelCNN Decoders

conditional Image generation with PixelCNN DecodersICML的best paperpixel cnn 屬于完全可見的信念網絡&#xff0c;需要對 概率密度 建模。給定圖像數據x&#xff0c;想要對概率分布p(x)建模。概率分布p(x)可以看做&#xff0c;每一像素分布同時作用結果的一個聯合分布。一…

Expression : invalid operator 解決方法

從技術上說&#xff0c;用于排序關聯容器的比較函數必須在它們所比較的對象上定義一個“嚴格的弱序化(strict weak ordering)”。&#xff08;傳給sort等算法的比較函數也有同樣的限制&#xff09;,就是兩個對象比大小或先后的規則&#xff0c;比如兩個 string對象比大小的規則…

leetcode23 合并K個排序鏈表

合并 k 個排序鏈表&#xff0c;返回合并后的排序鏈表。請分析和描述算法的復雜度。 示例: 輸入: [ 1->4->5, 1->3->4, 2->6 ] 輸出: 1->1->2->3->4->4->5->6 思路&#xff1a;把初始的每一個鏈表當成數組中的一個數&#xff0c;做…

Xcode LaunchImage 載入界面大小設置

iPhone Portrait iOS 8-Retina HD 5.5 (12422208) @3x iPhone Portrait iOS 8-Retina HD 4.7 (7501334) @2x iPhone Portrait iOS 7,8-2x (640960) @2x iPhone Portrait iOS 7,8-Retina 4 (6401136) @2x iPhone Portrait iOS 5,6-1x (320480) @1x iPhone Portrait iO…

leetcode237 刪除鏈表中的節點(你意想不到的做法,注意細節)

請編寫一個函數&#xff0c;使其可以刪除某個鏈表中給定的&#xff08;非末尾&#xff09;節點&#xff0c;你將只被給定要求被刪除的節點。 現有一個鏈表 -- head [4,5,1,9]&#xff0c;它可以表示為: 示例 1: 輸入: head [4,5,1,9], node 5 輸出: [4,1,9] 解釋: 給定你鏈…

cppcheck值得注意的一些篩選項

使用完cppcheck進行C代碼檢測之后&#xff0c;可能篩選起來很麻煩&#xff0c;一般常見的優化有 emptiness&#xff0c;就是當你使用stl的時候&#xff0c;最好用empty替代size 還有就是 leak

C++(19)--自定義Array,vector練習

自定義Array,vector1.自定義Array2.自定義vector《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》-------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------1.自定義…

讓cocos2dx支持并通過arm64 編譯

為了要支持64位,請把這個文件直接替換到對應的lib目錄下,本來是需要改neton_matrix_impl.c里的宏定義, 在 platform/ios/EAGLVIEW.mm中 在neon_matrix_impl.c中修改 #if defined(__ARM_NEON__) 為#if defined(_ARM_ARCH_7) 還有 third_party目錄下的curl的支持。

springboot——概述

Spring Boot 介紹 Spring Boot 是由 Pivotal 團隊提供的全新框架&#xff0c;其設計?的是?來簡化新 Spring 應? 初始搭建以及開發過 程&#xff0c;該框架使?了特定的?式來進?配置&#xff0c;從?使開發?員不再需要定義樣板化的配置。 默認配置了很多框架的使??式…

C++(20)--類型自動轉換

類型自動轉換1.C內置類型轉換2.實現自定義類的類型轉換《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》 -------------簡單的事情重復做&#xff0c;重復的事情用心做&#xff0c;用心的事情堅持做(老九君)---------------…

關于遍歷linux的文件目錄的坑- readdir

去年給公司寫了一個配置服務器,目的是解決運維的工作量太大,而且傳送服務器需要的配置文件需要腳本傳送到各個服(每個服ip不一樣,需要scp),然后再刷新通知各個GameServer,中間有沒有傳送失敗并不得知,而且維護相當麻煩,所以我寫了這個服務器,所有區服的配置都在這里邊…

終于,我讀懂了所有Java集合——sort

Collections.sort 事實上Collections.sort方法底層就是調用的Arrays.sort方法&#xff0c;而Arrays.sort使用了兩種排序方法&#xff0c;快速排序和優化的歸并排序。 快速排序主要是對那些基本類型數據&#xff08;int,short,long等&#xff09;排序&#xff0c; 而歸并排序用于…

PRML(1)--緒論(上)多項式曲線擬合、概率論

PRML緒論1.1 多項式曲線擬合1.1.1 問題描述1.1.2 最小化平方和誤差1.1.3 多項式階數確定1.1.4 有趣問題--高階模型為什么效果不好1.1.4 數據集規模對模型的影響1.1.5 參數正則化緩解過擬合問題1.2 概率論1.2.1離散型隨機變量1.2.2 連續型隨機變量1.2.3 期望和方差1.2.4 貝葉斯概…