|
楼主 |
发表于 2009-9-11 13:36:09
|
显示全部楼层
回复 #4 modern 的帖子
感谢modern的关注。我看了一下,在linux下,使用的是ACE_Select_Reactor
/*****************关键代码见下边**********************/
int CReactiveAcceptor::Open(CMainFrame *cmf)
{
m_bRun = true;
m_nClientIndex = 0;
if(!cmf)
return -1;
m_pFrame = cmf;
//这里边用了一个开源的读取XML的CPP读取配置文件
if(LoadConf() < 0)
return -1;
//启动一个线程,线程内根据getq获得的消息类型,处理不同事务
activate();
//监听客户端连接
ACE_INET_Addr listenAddr(m_nPort);
if(m_Acceptor.open(listenAddr, 1) == -1)
{
MyDebug((LM_ERROR, _T("m_Acceptor.open(listenAddr, 1) == -1\n")));
return -1;
}
return ( (ACE_Reactor::instance())->register_handler(this, ACE_Event_Handler::ACCEPT_MASK) );
}
/****************这是线程处理函数****************************/
int CReactiveAcceptor::svc(void)
{
int nType;
CServiceHandler *p = NULL;
while(m_bRun)
{
ACE_Message_Block *mb;
getq(mb);
nType = mb->msg_type();
mb->release();
switch(nType)
{
case ACE_Message_Block::MB_DATA:
p = new CServiceHandler(m_nClientIndex++);
if(p)
{
if( (this->m_Acceptor.accept(p->;Peer())) == -1 )
{
MyDebug((LM_ERROR, _T("accept connection error\n")));
m_nClientIndex--;
delete p;
}
else
{
if(p->Open() < 0)
{
delete p;
p = NULL;
m_nClientIndex--;
continue;
}
MyDebug((LM_INFO, _T("accept connection success\n")));
}
}//if(p)
break;
case ACE_Message_Block::MB_HANGUP:
m_bRun = false;
return 0;
default:
break;
}
}//while
return 0;
}
[ 本帖最后由 front_windy 于 2009-9-11 13:43 编辑 ] |
|