小技巧: ACE_Svc_Handler的初始化
Stone Jiang
ACE_Svc_Handler經常用于網絡服務類的基類,這是因為它很容易在主動對象(Active Ojbect)
模式和反應器(Reactor)框架中使用。APG第7.6節中討論了怎么在接受器-連接器(Acceptor-conector)
框架中如何把ACE_Svc_Handler作為目標來使用,并且,在C++NPv2第7章中,深度探討了
Acceotor-Connector的相關設計。
掛勾函數(Hook method)ACE_Svc_Handler::open()常是服務中新建連接時執行的初始化設置的地方。
舉例來說,如果服務要在日志中記錄新連接建立的相關信息,open()函數是則是記錄這個信息的地方。
對于使用Reacotor 框架的服務檢查網絡數據到達,open()是執行reactor注冊的地方。
事實上,這正是reactor注冊的地方,這種動作在服務建立新連接時非常常見的,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;
所以,如果在與服務建立新連接并為“讀事件”注冊時,你甚至不需要在你的類中
實現open(void*)函數,ACE已經為你做了這一步!另外,請記住,如果reactor注冊失敗,
默認的open()函數會返回-1,它會引起Acceptor-Connector框架關閉新建的連接和刪除這個
事件處理器(handler)。
Stone Jiang
http://www.shnenglu.com/ace/