ACE小技巧:在ACE_Acceptor框架中,自定義服務(wù)處理器的創(chuàng)建
Stone Jiang
ACE_Acceptor框架使對(duì)新連接的偵聽(tīng)變得容易,也使創(chuàng)建和激活新連接的ACE_Svc_Handler的派生類(lèi)變得容易。之前我們已經(jīng)了解了ACE_Svc_Handle::open()掛勾函數(shù)和服務(wù)處理器
初始化時(shí)它所扮演的角色。本文我們回退幾步,來(lái)了解服務(wù)處理器是如何實(shí)例化的以及我們?nèi)绾巫远x它的行為。
再看看ACE_Acceptor類(lèi),它是一個(gè)模板類(lèi),第一個(gè)模板參數(shù)ACE_Accetpor是代表與服務(wù)建立連接的處理器。當(dāng)新的連接建立時(shí),ACE_Acceptor調(diào)用make_svc_handler()掛勾函數(shù)來(lái)
實(shí)際創(chuàng)建的新建服務(wù)處理器對(duì)象。ACE_Acceptor::make_svc_handler()的實(shí)現(xiàn)如下:
template?
<
class
?SVC_HANDLE,ACE_PEER_ACCEPTOR_1
>
int
ACE_Acceptor
<
SVC_HANDLE,?ACE_PEER_ACCEPTOR_2
>
::make_svc_handler(SVC_HANDLE
*&
?sh)
{
??ACE_TRACE?(
"
ACE_Acceptor<SVC_HANDLER,?ACE_PEER_ACCEPTOR_2>::make_svc_handler
"
);??
if
?(sh?
==
?
0
)
????ACE_NEW_RETURN?(sh,
????????????????????SVC_HANDLER,
????????????????????
-
1
);??
//
?Set?the?reactor?of?the?newly?created?<SVC_HANDLER>?to?the?same
??
//
?reactor?that?this?<ACE_Acceptor>?is?using.
??sh
->
reactor?(
this
->
reactor?());
??
return
?
0
;
}
?
默認(rèn)的實(shí)現(xiàn)包括了兩步基本操作:
1.? 獲得一個(gè)新的SVC_HANLDER對(duì)象, 這里是使用的new運(yùn)算符分配的。
2.? 設(shè)置新的服務(wù)處理器的reactor指針為ACE_Accetpor使用的reactor的。
然而,如果應(yīng)用程序需要通過(guò)其它方式獲得SVC_HANDLER對(duì)象,而不是通過(guò)默認(rèn)的構(gòu)造函數(shù)那種動(dòng)態(tài)分配,這又該怎么辦呢?舉例來(lái)說(shuō),我們可能需要:
?. 從一個(gè)預(yù)分配的池中獲得SVC_HANDLER對(duì)象;
?. 為新創(chuàng)建的SVC_HANDLER傳入一些額外的信息
?. 使用單體的SVC_HANDLER
上面這些情形,我們都可以自定義make_svc_handler()掛勾函數(shù)來(lái)實(shí)現(xiàn)必要的行為。例如,假定我們新的處理器需要擁有一個(gè)處理所有對(duì)所有接收到的消息進(jìn)行集中處理的中心處理
器。這個(gè)中心處理器我們用類(lèi)Processor表示。我們需要每個(gè)服務(wù)處理器都擁有一個(gè)指向中心處理器的指針,而不是使Processor成為一個(gè)全局訪問(wèn)的指針(使用全局變量的種種弊端
本文不作詳述)。我們的解決辦法是: 從ACE_Accetor派生一個(gè)新類(lèi),這個(gè)新類(lèi)擁有Processor的指針作成員,并且,在創(chuàng)建新和服務(wù)處理器(Service)的時(shí)候,把這個(gè) Processor的
指針作參數(shù)傳進(jìn)去。
新的acceptor類(lèi)可以這樣定義:
class
?My_Acceptor?:?
public
?ACE_Acceptor
<
Service,?ACE_SOCK_ACCEPTOR
>
...
{
public
:

??My_Acceptor?(Processor?
*
processor)?:?processor_?(processor)?
...
{?}
;
??
??
int
?make_svc_handler?(Service?
*&
sh)

????
...
{
??????
if
?(sh?
==
?
0
)
????????ACE_NEW_RETURN?(sh,
????????????????????????Service?(
this
->
processor_),
????????????????????????
-
1
);??????
//
?Set?the?reactor?of?the?newly?created?<SVC_HANDLER>?to?the?same
??????
//
??reactor?that?this?<ACE_Acceptor>?is?using.
??????sh
->
reactor?(
this
->
reactor?());
??????
return
?
0
;
????}
private
:
??Processor?
*
processor_;
}
?
就這樣,現(xiàn)在,當(dāng)My_Acceptor接受新連接的時(shí)候,make_svc_handler()掛勾函數(shù)分配一個(gè)新的處理器(Service),并把Processor*作為參數(shù)傳進(jìn)去。需要注意的事,盡管這里使用
的是這一個(gè)構(gòu)造函數(shù)Service(Processor*)。我們?nèi)孕枨鬄镾ervice類(lèi)定義默認(rèn)的構(gòu)造函數(shù),以滿(mǎn)足模板類(lèi)ACE_Acceptor的需要。
?