ACE接受器 - My_Svc_Handler类

时间:2011-10-04 19:44:24

标签: sockets ace reactor

我正在使用ace接受器来侦听TCP端口。 我的类从My_Svc_Handler中获取并且暗示类My_Svc_Handler的funcion 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)吗?

1 个答案:

答案 0 :(得分:0)

您需要注册的原因是因为UNIX / Linux上ACE中的Reactor的默认实现是Select_Reactor,并且正如名称所暗示的那样,所有这个反应器正在运行{{1}系统调用,当套接字上的数据可用时调度事件。因此,除非您告诉select将套接字添加到select s中的套接字列表中,读取或写入描述符列表select在套接字上存在数据时将不会执行任何操作。< / p>

这就是Reactor的用途。