ACE反應器 Reactor 模式 3

2021-04-26 20:24:27 字數 1996 閱讀 5042

在伺服器端使用reactor框架

使用reactor框架的伺服器端結構如下:

伺服器端註冊兩種事件處理器,clientacceptor和clientservice ,clientservice類負責和客戶端的通訊,每乙個clientservice物件對應乙個客戶端的socket連線。 clientacceptor專門負責被動接受客戶端的連線,並建立clientservice物件。這樣,在乙個n個socket連線的伺服器程式中,將存在1個clientacceptor物件和n個clientservice物件。

整個伺服器端流程如下:

首先建立乙個clientacceptor物件,該物件在reactor上註冊accept_mask事件,reactor將自動在監聽埠建立socket監聽。

如果有對該埠的socket連線時,reactor將自動**handle_input方法,clientacceptor過載此方法,並建立乙個clientservice物件,用於處理和client的通訊。

clientservice物件根據伺服器的具體功能實現,其處理過程和客戶端程式類似,註冊相應的**事件並分發即可。

**如下:

#include

#include

#include

#include

#include

class clientservice : public ace_event_handler

int open (void)

virtual ace_handle get_handle (void) const

virtual

int handle_input (ace_handle fd )

// 釋放相應資源

virtual

int handle_close (ace_handle, ace_reactor_mask mask)

protected:

char buf[100];

ace_sock_stream sock_;

};class clientacceptor : public ace_event_handler

int open (const ace_inet_addr &listen_addr)

//註冊接受連線**事件

return

this->reactor ()->register_handler(this, ace_event_handler::accept_mask);

}virtual ace_handle get_handle (void) const

virtual

int handle_input (ace_handle fd )

p.release ();

client->reactor (this->reactor ());

if (client->open () == -1)

client->handle_close (ace_invalid_handle, 0);

return 0;

}virtual

int handle_close (ace_handle handle,

ace_reactor_mask close_mask)

return 0;

}protected:

ace_sock_acceptor acceptor_;

};int main(int argc, char *argv)

return 0;

}**功能比較簡單,需要注意以下幾點:

這裡註冊事件的方式和前面的文章中方式不一樣,是通過ace_event_handler類的

reactor()方法設定和獲取reactor的指標,比較直觀和方便。前面的文章是通過ace_reactor::instance()來獲取的乙個單體reactor的指標。

當客戶端socket連線關閉時,需要釋放相應資源,需要注意一下clientservice物件的handle_close方法中釋放資源的相應**。

ACE反應器 Reactor 模式 4

定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...

ACE反應器 Reactor 模式 2

在socket程式設計中,常見的事件就是 讀就緒 寫就緒 通過對這兩個事件的捕獲分發,可以實現socket中的非同步操作。socket程式設計中的事件處理器 在前面我們已經介紹過,在ace反應器框架中,任何都必須派生自ace event handler類,並通過過載其相應會調事件處理函式來實現相應的...

ACE反應器 Reactor 模式 4

定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...