0

TCPポートをリッスンするためにaceアクセプターを使用しています。私のクラスはMy_Svc_Handlerから継承し、クラスMy_Svc_Handlerの関数int open(void *)を意味します。私が見たすべての例で、open関数内で、それらはリアクターを登録します。

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

なぜ登録する必要があるのか​​理解できません。私はすでにイベントを待っているリアクターを持っています。これは私がメインで定義したものです:

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(); 
}

open関数がいつ呼び出されるのかわかりません。

その方法について別の質問があります。while(1)を実行しないメインに別の方法はありますか?

4

1 に答える 1

0

登録が必要な理由は、ReactorUNIX/Linux での ACEの既定の実装は、Select_Reactorその名前が示すように、このリアクタが実行しているのはselect、データがソケットで利用可能になったときにイベントをディスパッチするシステム コールの実行だけだからです。したがってselect、s のソケットのリストにソケットを追加するように指示しない限り、ソケットにデータが存在する場合、select記述子リストの読み取りまたは書き込みReactorは何もしません。

それregister_handlerがそのためです。

于 2012-01-05T17:38:03.817 に答える