小技巧: ACE_Svc_Handler的初始化
Stone Jiang
ACE_Svc_Handler經(jīng)常用于網(wǎng)絡(luò)服務(wù)類的基類,這是因?yàn)樗苋菀自谥鲃訉ο?Active Ojbect)
模式和反應(yīng)器(Reactor)框架中使用。APG第7.6節(jié)中討論了怎么在接受器-連接器(Acceptor-conector)
框架中如何把ACE_Svc_Handler作為目標(biāo)來使用,并且,在C++NPv2第7章中,深度探討了
Acceotor-Connector的相關(guān)設(shè)計。
掛勾函數(shù)(Hook method)ACE_Svc_Handler::open()常是服務(wù)中新建連接時執(zhí)行的初始化設(shè)置的地方。
舉例來說,如果服務(wù)要在日志中記錄新連接建立的相關(guān)信息,open()函數(shù)是則是記錄這個信息的地方。
對于使用Reacotor 框架的服務(wù)檢查網(wǎng)絡(luò)數(shù)據(jù)到達(dá),open()是執(zhí)行reactor注冊的地方。
事實(shí)上,這正是reactor注冊的地方,這種動作在服務(wù)建立新連接時非常常見的,ACE_Svc_Handler::
open()的缺省操作也正是
if (this->reactor () && this->reactor ()->register_handler
(this,
ACE_Event_Handler::READ_MASK) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
ACE_LIB_TEXT ("%p\n"),
ACE_LIB_TEXT ("unable to register client handler")),
-1);
return 0;
所以,如果在與服務(wù)建立新連接并為“讀事件”注冊時,你甚至不需要在你的類中
實(shí)現(xiàn)open(void*)函數(shù),ACE已經(jīng)為你做了這一步!另外,請記住,如果reactor注冊失敗,
默認(rèn)的open()函數(shù)會返回-1,它會引起Acceptor-Connector框架關(guān)閉新建的連接和刪除這個
事件處理器(handler)。
Stone Jiang
http://www.shnenglu.com/ace/