dustfly_2001 发表于 2010-1-15 16:33:17

Dev_Poll_Reactor的问题

1 一个客户端 一个服务器 客户端只要发现和服务器的连接断开后 就重新连接服务器
2 服务器在接受连接后,在open中启动一个消息处理线程,用来处理客户端发送过来的消息,然后发送一个查询命令给客户端,客户端返回响应,服务器在消息处理线程中处理该响应,根据客户端返回的消息检查客户端是否合法,如果发现客户端非法,则peer().close关闭连接

我的测试就是客户端返回的信息不符合服务器要求
问题是,每次服务器端的消息处理线程发现客户端非法,peer().close后,服务器总是先再一次接受客户端新的连接进入open,然后才进入上一个连接的handle_close,而且第二次服务端进入open后,发送命令给客户端,客户端能接受,并且会返回响应给服务器,但服务器就是收不到,可handle_events很正常,一直在运行。

但是同样的情况用Select_Reactor则每次服务器都是先进入handle_close,再进入下一个连接的open,并且消息一直能正常收发

int ServerServiceHandler::open(void*)
{
    if (ACE_Thread_Manager::instance()->spawn(msgproc, (void*)this) == -1)
    {
       return -1;
    }
    ret = ACE_Reactor::instance()->register_handler(this, ACE_Event_Handler::READ_MASK);
    if (ret < 0)
   {
      return ret;
    }

   printf("开始查询信息\n");
   QueryStatusInfo();
   return 0;
}


msgproc(void *p)
{
........
   if (客户端信息非法)
   {
       peer().close();
   }
}


main:
    ..............
    ACE_Dev_Poll_Reactor *poll_reactor = new ACE_Dev_Poll_Reactor();
    poll_reactor->restart(1);
    ACE_Reactor *default_reactor = new ACE_Reactor(poll_reactor);

    ACE_Thread_Manager::instance()->spawn(event_loop, ....);

    // open listen port
    ..............

    // wait



event_loop:
    while (true)
    {
      ACE_Time_Value tv(2, 0);
      int retval = reactor->handle_events(&tv);
    }

[ 本帖最后由 dustfly_2001 于 2010-1-15 16:35 编辑 ]
页: [1]
查看完整版本: Dev_Poll_Reactor的问题