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