#include "StdAfx.h" #include "NetLinkMgr.h" #include "Config.h" #include "ControlShell.h" #include "ProxyShell.h" SINGLETON_IMPLEMENT(CNetLinkMgr) CNetLinkMgr::CNetLinkMgr(void) : m_ClientCount(0) { } CNetLinkMgr::~CNetLinkMgr(void) { } /***************************************************************** **【函数名称】 onClientConnect **【函数功能】 客户端连接的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::__onClientConnect( const PduLinkContent& linkContent ) { if(m_ClientCount >= NET_MAX_CLIENT) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Net}: 网络客户端已达到最大值, 将丢弃新连接, FarEnd[%s:%d]"), linkContent.szFarIp, linkContent.nFarPort); CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(linkContent.nFarType, linkContent.nFarId); } else ++m_ClientCount; } /***************************************************************** **【函数名称】 __onClinetReg **【函数功能】 客户端注册的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::__onClientReg( const PduLinkContent& linkContent ) { CProxyShell::GetInstance().onNetworkClientReg(linkContent.nFarType, linkContent.nFarId); } /***************************************************************** **【函数名称】 __procReqReg **【函数功能】 客户端注册的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::__procReqReg( CPduEntity* a_pReq ) { bool RegResult = false; if(a_pReq->GetLocalDevType() == PDU_DEV_TYPE_SC_CLIENT) RegResult = true; // 发送注册结果 a_pReq->SetToExecReturn(); a_pReq->SetDataBool(0, RegResult); CInterfaceWindow::getIocpCommInstance()->Send(a_pReq, a_pReq->GetLocalDevType(), a_pReq->GetLocalDevId()); } /***************************************************************** **【函数名称】 open **【函数功能】 打开网络连接 **【参数】 **【返回值】 ****************************************************************/ bool CNetLinkMgr::open( void ) { // 初始化命令配置 #ifdef _DEBUG CPduDataFormat::getInstance()->Load("../StableCore/ScPduFormat.ini"); #else CPduDataFormat::getInstance()->Load("./ScPduFormat.ini"); #endif // 注册事件响应接口 CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE); CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE); if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(CConfig::listenPort(), PDU_DEV_TYPE_SC_SERVER, 0)) { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{NetLinkMgr}: 创建网络服务端失败, ListenPort = %d"), CConfig::listenPort()); return false; } else { LOGGER(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{NetLinkMgr}: 创建网络服务端成功, ListenPort = %d"), CConfig::listenPort()); return true; } } /***************************************************************** **【函数名称】 close **【函数功能】 关闭网络连接 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::close( void ) { CInterfaceWindow::getIocpLinkInstance()->StopAll(); } /***************************************************************** **【函数名称】 send **【函数功能】 发送数据 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::send( CPduEntity* a_pPdu ) { CInterfaceWindow::getIocpCommInstance()->Send2All(a_pPdu); } /***************************************************************** **【函数名称】 send **【函数功能】 发送数据 **【参数】 **【返回值】 ****************************************************************/ bool CNetLinkMgr::send( CPduEntity* a_pPdu, PDU_DEV_TYPE a_DestType, int a_DestId ) { return CInterfaceWindow::getIocpCommInstance()->Send(a_pPdu, a_DestType, a_DestId) ? true : false; } /***************************************************************** **【函数名称】 OnLinkStateChanged **【函数功能】 连接状态信息变化 **【参数】 **【返回值】 ****************************************************************/ void CNetLinkMgr::OnLinkStateChanged( const PduLinkContent& linkContent ) { // 连接信息日志显示 LOG_LEVEL nLogLevel = LOG_LEVEL_WARNING; CString Msg; switch(linkContent.nLinkState) { case PDU_LINK_STATE_ACCEPTED: { Msg.Format(_T("{Net}: FarEnd[%s:%d] Accepted"), linkContent.szFarIp, linkContent.nFarPort); nLogLevel = LOG_LEVEL_NORMAL; __onClientConnect(linkContent); } break; case PDU_LINK_STATE_DISCONNECTED: { Msg.Format(_T("{Net}: FarEnd[%s:%d] Disconnected"), linkContent.szFarIp, linkContent.nFarPort); nLogLevel = LOG_LEVEL_WARNING; --m_ClientCount; } break; case PDU_LINK_STATE_REG_OK: { Msg.Format(_T("{Net}: FarEnd[%s:%d] Reg OK"), linkContent.szFarIp, linkContent.nFarPort); nLogLevel = LOG_LEVEL_NORMAL; __onClientReg(linkContent); } break; case PDU_LINK_STATE_REG_FAILED: { Msg.Format(_T("{Net}: FarEnd[%s:%d] Reg Failed"), linkContent.szFarIp, linkContent.nFarPort); nLogLevel = LOG_LEVEL_WARNING; } break; default: { ASSERT(FALSE); Msg.Format(_T("{Net}: FarEnd[%s:%d] Unknown Netlink State"), linkContent.szFarIp, linkContent.nFarPort); nLogLevel = LOG_LEVEL_WARNING; } break; } // 通知日志 LOGGER(LOG_CLASS_SOCKET, nLogLevel, _T("%s"), Msg); } /***************************************************************** **【函数名称】 OnRecvCommand **【函数功能】 Pdu命令处理接口 **【参数】 a_pPduEntity:消息实体 **【返回值】 ****************************************************************/ void CNetLinkMgr::OnRecvCommand( CPduEntity* a_pPduEntity ) { ASSERT(a_pPduEntity != NULL); if(a_pPduEntity->GetCmdType() == PDU_CMD_LISTEN) return; if(a_pPduEntity->GetCmdType() == PDU_CMD_REG) __procReqReg(a_pPduEntity); else CProxyShell::GetInstance().onNetworkClientReq(a_pPduEntity); // 将PDU交由上层处理 }