ACE акцептор - класс My_Svc_Handler - PullRequest
       21

ACE акцептор - класс My_Svc_Handler

0 голосов
/ 04 октября 2011

Я использую ACE-акцептор для прослушивания порта TCP.Мой класс наследует от My_Svc_Handler и реализует функцию int open (void *) класса My_Svc_Handler.Во всех примерах, которые я видел, внутри функции открытия они регистрируют реактор:

 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)?

1 Ответ

0 голосов
/ 05 января 2012

Причина, по которой вам нужно зарегистрироваться, заключается в том, что реализация по умолчанию Reactor в ACE в UNIX / Linux - Select_Reactor, и, как следует из названия, все, что делает этот реактор, выполняет системный вызов select, который отправляет события когда данные доступны на сокете. Поэтому, если вы не скажете select добавить сокет в список сокетов в списках дескрипторов чтения или записи select, Reactor ничего не сделает, когда в сокете есть данные.

Вот для чего register_handler.

...