0

我正在使用 ace 接受器来监听 TCP 端口。我的类继承自 My_Svc_Handler 并隐含了 My_Svc_Handler 类的函数 int open (void *)。在我看到的所有示例中,在 open 函数中,它们注册了反应器:

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

我不明白为什么我们需要注册?我已经有一个反应堆在等待一个事件。这是我在 main 中定义的:

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

你需要注册的原因是因为ReactorACE 在 UNIX/Linux 上的默认实现是Select_Reactor,顾名思义,这个反应器所做的就是运行一个select系统调用,当数据在套接字上可用时调度事件。因此,除非您告诉select将套接字添加到selects 读取或写入描述符列表中的套接字列表中,Reactor否则当套接字上存在数据时不会做任何事情。

register_handler就是为了。

于 2012-01-05T17:38:03.817 回答