| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #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交由上层处理
- }
|