bool CProControlListen::AddListen( const char* pListenIP, uint32 u4Port, uint8 u1IPType ) { bool blState = App_ProConnectAcceptManager::instance()->CheckIPInfo(pListenIP, u4Port); if(true == blState) { //当前监听已经存在,不可以重复建设 OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen](%s:%d) is exist.\n", pListenIP, u4Port)); return false; } //创建一个新的accept对象 ProConnectAcceptor* pProConnectAcceptor = App_ProConnectAcceptManager::instance()->GetNewConnectAcceptor(); if(NULL == pProConnectAcceptor) { OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen](%s:%d) new ConnectAcceptor error.\n", pListenIP, u4Port)); return false; } ACE_INET_Addr listenAddr; //判断IPv4还是IPv6 int nErr = 0; if(u1IPType == TYPE_IPV4) { nErr = listenAddr.set(u4Port, pListenIP); } else { nErr = listenAddr.set(u4Port, pListenIP, 1, PF_INET6); } if(nErr != 0) { OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen](%s:%d)set_address error[%d].\n", pListenIP, u4Port, errno)); return false; } //创建新的监听 //设置监听IP信息 pProConnectAcceptor->SetListenInfo(pListenIP, u4Port); ACE_Proactor* pProactor = App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE); if(NULL == pProactor) { OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen]App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE) is NULL.\n")); return false; } int nRet = pProConnectAcceptor->open(listenAddr, 0, 1, App_MainConfig::instance()->GetBacklog(), 1, pProactor); if(-1 == nRet) { OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen] Listen from [%s:%d] error(%d).\n",listenAddr.get_host_addr(), listenAddr.get_port_number(), errno)); return false; } OUR_DEBUG((LM_INFO, "[CProControlListen::AddListen](%s:%d)Add Listen success.\n", pListenIP, u4Port)); return true; }
void CProControlListen::ShowListen(vecControlInfo& objProControlInfo) { objProControlInfo.clear(); for(int i = 0; i < App_ProConnectAcceptManager::instance()->GetCount(); i++) { ProConnectAcceptor* pProConnectAcceptor = App_ProConnectAcceptManager::instance()->GetConnectAcceptor(i); if(NULL != pProConnectAcceptor) { _ControlInfo objInfo; sprintf_safe(objInfo.m_szListenIP, MAX_BUFF_20, "%s", pProConnectAcceptor->GetListenIP()); objInfo.m_u4Port = pProConnectAcceptor->GetListenPort(); objProControlInfo.push_back(objInfo); } } }
bool CProServerManager::Start() { //注册信号量 //if(0 != App_SigHandler::instance()->RegisterSignal(NULL)) //{ // return false; //} //启动TCP监听 int nServerPortCount = App_MainConfig::instance()->GetServerPortCount(); bool blState = false; for(int i = 0 ; i < nServerPortCount; i++) { ACE_INET_Addr listenAddr; _ServerInfo* pServerInfo = App_MainConfig::instance()->GetServerPort(i); if(NULL == pServerInfo) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]pServerInfo [%d] is NULL.\n", i)); return false; } int nErr = listenAddr.set(pServerInfo->m_nPort, pServerInfo->m_szServerIP); if(nErr != 0) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start](%d)set_address error[%d].\n", i, errno)); return false; } //得到接收器 ProConnectAcceptor* pConnectAcceptor = m_ConnectAcceptorManager.GetConnectAcceptor(i); if(NULL == pConnectAcceptor) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]pConnectAcceptor[%d] is NULL.\n", i)); return false; } ACE_Proactor* pProactor = App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE); if(NULL == pProactor) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE) is NULL.\n")); return false; } int nRet = pConnectAcceptor->open(listenAddr, 0, 1, MAX_ASYNCH_BACKLOG, 1, pProactor); if(-1 == nRet) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start] pConnectAcceptor->open[%d] is error.\n", i)); OUR_DEBUG((LM_INFO, "[CProServerManager::Start] Listen from [%s:%d] error(%d).\n",listenAddr.get_host_addr(), listenAddr.get_port_number(), errno)); return false; } OUR_DEBUG((LM_INFO, "[CProServerManager::Start] Listen from [%s:%d] OK.\n", listenAddr.get_host_addr(), listenAddr.get_port_number())); } //启动UDP监听 int nUDPServerPortCount = App_MainConfig::instance()->GetUDPServerPortCount(); for(int i = 0 ; i < nUDPServerPortCount; i++) { ACE_INET_Addr listenAddr; _ServerInfo* pServerInfo = App_MainConfig::instance()->GetUDPServerPort(i); if(NULL == pServerInfo) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]UDP pServerInfo [%d] is NULL.\n", i)); return false; } CProactorUDPHandler* pProactorUDPHandler = App_ProUDPManager::instance()->Create(); if(NULL == pProactorUDPHandler) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start] pProactorUDPHandler is NULL[%d] is error.\n", i)); return false; } else { int nErr = listenAddr.set(pServerInfo->m_nPort, pServerInfo->m_szServerIP); if(nErr != 0) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start](%d)UDP set_address error[%d].\n", i, errno)); return false; } ACE_Proactor* pProactor = App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE); if(NULL == pProactor) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]UDP App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE) is NULL.\n")); return false; } if(0 != pProactorUDPHandler->OpenAddress(listenAddr, pProactor)) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start] UDP Listen from [%s:%d] error(%d).\n",listenAddr.get_host_addr(), listenAddr.get_port_number(), errno)); return false; } OUR_DEBUG((LM_INFO, "[CProServerManager::Start] UDP Listen from [%s:%d] OK.\n", listenAddr.get_host_addr(), listenAddr.get_port_number())); } } //启动后台管理端口监听 if(App_MainConfig::instance()->GetConsoleSupport() == CONSOLE_ENABLE) { ACE_INET_Addr listenConsoleAddr; int nErr = listenConsoleAddr.set(App_MainConfig::instance()->GetConsolePort(), App_MainConfig::instance()->GetConsoleIP()); if(nErr != 0) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]listenConsoleAddr set_address error[%d].\n", errno)); return false; } ACE_Proactor* pProactor = App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE); if(NULL == pProactor) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_ProactorManager::instance()->GetAce_Proactor(REACTOR_CLIENTDEFINE) is NULL.\n")); return false; } int nRet = m_ProConsoleConnectAcceptor.open(listenConsoleAddr, 0, 1, MAX_ASYNCH_BACKLOG, 1, pProactor, true); if(-1 == nRet) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start] m_ProConsoleConnectAcceptor.open is error.\n")); OUR_DEBUG((LM_INFO, "[CProServerManager::Start] Listen from [%s:%d] error(%d).\n",listenConsoleAddr.get_host_addr(), listenConsoleAddr.get_port_number(), errno)); return false; } } //启动日志服务线程 if(0 != AppLogManager::instance()->Start()) { AppLogManager::instance()->WriteLog(LOG_SYSTEM, "[CProServerManager::Init]AppLogManager is ERROR."); } else { AppLogManager::instance()->WriteLog(LOG_SYSTEM, "[CProServerManager::Init]AppLogManager is OK."); } /* //设置定时器策略(使用高精度定时器) (void) ACE_High_Res_Timer::global_scale_factor (); auto_ptr<ACE_Timer_Heap_Variable_Time_Source> tq(new ACE_Timer_Heap_Variable_Time_Source); tq->set_time_policy(&ACE_High_Res_Timer::gettimeofday_hr); App_TimerManager::instance()->timer_queue(tq); tq.release(); */ //启动定时器 if(0 != App_TimerManager::instance()->activate()) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_TimerManager::instance()->Start() is error.\n")); return false; } //先启动其他的Proactor,最后启动原始的Proactor,因为原始的会挂起线程,所以最后启动一下。 if(!App_ProactorManager::instance()->StartProactor()) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_ProactorManager::instance()->StartProactor is error.\n")); return false; } //启动中间服务器链接管理器 App_ClientProConnectManager::instance()->Init(App_ProactorManager::instance()->GetAce_Proactor(REACTOR_POSTDEFINE)); App_ClientProConnectManager::instance()->StartConnectTask(App_MainConfig::instance()->GetConnectServerCheck()); //初始化模块加载,因为这里可能包含了中间服务器连接加载 blState = App_ModuleLoader::instance()->LoadModule(App_MainConfig::instance()->GetModulePath(), App_MainConfig::instance()->GetModuleString()); if(false == blState) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]LoadModule is error.\n")); return false; } //开始消息处理线程 App_MessageService::instance()->Start(); //开始启动链接发送定时器 App_ProConnectManager::instance()->StartTimer(); //最后启动反应器 OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_ProactorManager::instance()->StartProactorDefault begin....\n")); if(!App_ProactorManager::instance()->StartProactorDefault()) { OUR_DEBUG((LM_INFO, "[CProServerManager::Start]App_ProactorManager::instance()->StartProactorDefault is error.\n")); return false; } return true; }