| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- #include "StdAfx.h"
- #include "NetworkAcd.h"
- #include "AcdCore.h"
- #include "Config.h"
- SINGLETON_IMPLEMENT(CNetworkAcd)
- CNetworkAcd::CNetworkAcd(void) : m_CtiDevID(0), m_IsCtiConnected(false)
- {
- }
- CNetworkAcd::~CNetworkAcd(void)
- {
- }
- /*****************************************************************
- **【函数名称】 OnLinkStateChanged
- **【函数功能】 PDU连接状态变化事件处理(重载函数)
- **【参数】
- **【返回值】
- ****************************************************************/
- void CNetworkAcd::OnLinkStateChanged( const PduLinkContent& linkContent )
- {
- CString Msg;
- LOG_LEVEL Level = LOG_LEVEL_NORMAL;
- switch(linkContent.nLinkState)
- {
- case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
- Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."),
- linkContent.szFarIp,
- linkContent.nFarPort);
- break;
- case PDU_LINK_STATE_FAILED: // 请求连接失败
- Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."),
- linkContent.szFarIp,
- linkContent.nFarPort);
- Level = LOG_LEVEL_WARNING;
- break;
- case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接
- Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."),
- linkContent.szFarIp,
- linkContent.nFarPort);
- break;
- case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
- {
- Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."),
- linkContent.szFarIp,
- linkContent.nFarPort);
- if(linkContent.nFarType == PDU_DEV_TYPE_CTI)
- m_IsCtiConnected = false;
- CAcdCore::GetInstance().onNetLinkDown(linkContent); // 后续处理
- }
- break;
- case PDU_LINK_STATE_REG_OK: // 注册成功
- {
- Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."),
- linkContent.nFarType,
- linkContent.nFarId,
- linkContent.szFarIp,
- linkContent.nFarPort);
- if(linkContent.nFarType == PDU_DEV_TYPE_CTI)
- {
- m_IsCtiConnected = true;
- m_CtiDevID = linkContent.nFarId;
- }
- }
- break;
- case PDU_LINK_STATE_REG_FAILED: // 注册失败
- Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
- linkContent.szFarIp,
- linkContent.nFarPort);
- Level = LOG_LEVEL_WARNING;
- break;
- default:
- Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
- linkContent.nFarType,
- linkContent.nFarId,
- linkContent.szFarIp,
- linkContent.nFarPort);
- break;
- } // end switch
- ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg);
- }
- /*****************************************************************
- **【函数名称】 OnRecvCommand
- **【函数功能】 接收具体命令并进行处理
- **【参数】
- **【返回值】
- ****************************************************************/
- void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity )
- {
- PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
- // 心跳包不处理
- if(Type == PDU_CMD_LISTEN)
- return;
- CAcdCore::GetInstance().onRecvCommand(a_pPduEntity);
- }
- /*****************************************************************
- **【函数名称】 init
- **【函数功能】 初始化
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::init( void )
- {
- // 初始化命令配置
- #ifdef _DEBUG
- CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini");
- #else
- CPduDataFormat::getInstance()->Load("./PDUFormat.ini");
- #endif
- // 注册事件响应接口
- CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE);
- CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE);
- // 连接到CTI
- CString Ip = CConfig::ctiIp();
- int Port = CConfig::ctiPort();
- // 创建SOCKET SERVER
- int ListenPort = CConfig::listenPort();
- if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(ListenPort, PDU_DEV_TYPE_ACD, 0))
- {
- ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 创建网络服务端失败, ListenPort = %d"), ListenPort);
- return false;
- }
- if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 0, PDU_DEV_TYPE_CTI, 0, true))
- {
- ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
- return false;
- } // end if
- ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 创建网络服务端成功, ListenPort = %d"), ListenPort);
- return true;
- }
- /*****************************************************************
- **【函数名称】 release
- **【函数功能】 连接释放
- **【参数】
- **【返回值】
- ****************************************************************/
- void CNetworkAcd::release( void )
- {
- CInterfaceWindow::getIocpLinkInstance()->StopAll();
- }
- /*****************************************************************
- **【函数名称】 send2Cti
- **【函数功能】 发送PDU到CTI
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity )
- {
- if(!m_IsCtiConnected)
- return false;
- CSingleLock Lock(&m_Lock4CTi, TRUE);
- return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE;
- }
- /*****************************************************************
- **【函数名称】 send2Agent
- **【函数功能】 发送PDU到Agent
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity )
- {
- return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
- }
- /*****************************************************************
- **【函数名称】 getAgentLinkInfo
- **【函数功能】 获取Agent连接信息
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort )
- {
- return CInterfaceWindow::getIocpLinkInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
- }
- /*****************************************************************
- **【函数名称】 shutDownAgentLink
- **【函数功能】 关闭Agent连接
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::shutDownAgentLink( int a_AgentId )
- {
- return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
- }
- /*****************************************************************
- **【函数名称】 getPduSource
- **【函数功能】 获取PDU来源
- **【参数】
- **【返回值】
- ****************************************************************/
- bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp )
- {
- return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE;
- }
|