|
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 编辑 ] |
|