2011-10-04 26 views
0

我正在使用ace acceptor來偵聽TCP端口。 我的類從My_Svc_Handler中插入並且實現類My_Svc_Handler的funcion int open(void *)。 在我看到的所有例子,open函數裏面,他們registor反應器:ACE acceptor - My_Svc_Handler類

ACE_Reactor::instance()->register_handler(this, 
    ACE_Event_Handler::READ_MASK); 

我不understant爲什麼我們需要registore?我已經有一個反應等待事件。我在主要定義:

typedef ACE_Acceptor<My_Svc_Handler,ACE_LSOCK_ACCEPTOR> MyAcceptor; 

int main(int argc, char* argv[]){ 
ACE_UNIX_Addr addr("/tmp/addr.ace"); 
MyAcceptor acceptor(address, ACE_Reactor::instance()); 

while(1) /* Start the reactors event loop */ 
    ACE_Reactor::instance()->handle_events(); 
} 

我想我不明白什麼時候被稱爲打開函數。

我對這種方式有另一個問題。主體沒有運行while(1)的方法嗎?

回答

0

您需要註冊的原因是因爲Reactor在UNIX/Linux上ACE的默認實現Select_Reactor和顧名思義這一切的反應器正在做的是運行select系統調用分派事件時數據可用在插座上。因此,除非您告訴select將套接字添加到select的讀取或寫入描述符列表中的套接字列表中,否則當套接字上存在數據時,將不會執行任何操作。

這就是register_handler的用途。