升龙物业 老版本 ocx IPO, 加密狗 转值班电话

NetworkAcd.cpp 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "StdAfx.h"
  2. #include "NetworkAcd.h"
  3. #include "AcdCore.h"
  4. #include "Config.h"
  5. SINGLETON_IMPLEMENT(CNetworkAcd)
  6. CNetworkAcd::CNetworkAcd(void) : m_CtiDevID(0), m_IsCtiConnected(false)
  7. {
  8. }
  9. CNetworkAcd::~CNetworkAcd(void)
  10. {
  11. }
  12. /*****************************************************************
  13. **【函数名称】 OnLinkStateChanged
  14. **【函数功能】 PDU连接状态变化事件处理(重载函数)
  15. **【参数】
  16. **【返回值】
  17. ****************************************************************/
  18. void CNetworkAcd::OnLinkStateChanged( const PduLinkContent& linkContent )
  19. {
  20. CString Msg;
  21. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  22. switch(linkContent.nLinkState)
  23. {
  24. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  25. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接成功..."),
  26. linkContent.szFarIp,
  27. linkContent.nFarPort);
  28. break;
  29. case PDU_LINK_STATE_FAILED: // 请求连接失败
  30. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接失败..."),
  31. linkContent.szFarIp,
  32. linkContent.nFarPort);
  33. Level = LOG_LEVEL_WARNING;
  34. break;
  35. case PDU_LINK_STATE_ACCEPTED: // 已接受对端连接
  36. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 已接受远端网络连接..."),
  37. linkContent.szFarIp,
  38. linkContent.nFarPort);
  39. break;
  40. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  41. {
  42. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."),
  43. linkContent.szFarIp,
  44. linkContent.nFarPort);
  45. if(linkContent.nFarType == PDU_DEV_TYPE_CTI)
  46. m_IsCtiConnected = false;
  47. CAcdCore::GetInstance().onNetLinkDown(linkContent); // 后续处理
  48. }
  49. break;
  50. case PDU_LINK_STATE_REG_OK: // 注册成功
  51. {
  52. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."),
  53. linkContent.nFarType,
  54. linkContent.nFarId,
  55. linkContent.szFarIp,
  56. linkContent.nFarPort);
  57. if(linkContent.nFarType == PDU_DEV_TYPE_CTI)
  58. {
  59. m_IsCtiConnected = true;
  60. m_CtiDevID = linkContent.nFarId;
  61. }
  62. }
  63. break;
  64. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  65. Msg.Format(_T("{Net}: Far End[IP = %s, Port = %d], Hint = 网络连接注册失败, 通讯禁止..."),
  66. linkContent.szFarIp,
  67. linkContent.nFarPort);
  68. Level = LOG_LEVEL_WARNING;
  69. break;
  70. default:
  71. Msg.Format(_T("{Net}: Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
  72. linkContent.nFarType,
  73. linkContent.nFarId,
  74. linkContent.szFarIp,
  75. linkContent.nFarPort);
  76. break;
  77. } // end switch
  78. ILogger::getInstance().log(LOG_CLASS_SOCKET, Level, "%s", Msg);
  79. }
  80. /*****************************************************************
  81. **【函数名称】 OnRecvCommand
  82. **【函数功能】 接收具体命令并进行处理
  83. **【参数】
  84. **【返回值】
  85. ****************************************************************/
  86. void CNetworkAcd::OnRecvCommand( CPduEntity* a_pPduEntity )
  87. {
  88. PDU_CMD_TYPE Type = a_pPduEntity->GetCmdType();
  89. // 心跳包不处理
  90. if(Type == PDU_CMD_LISTEN)
  91. return;
  92. CAcdCore::GetInstance().onRecvCommand(a_pPduEntity);
  93. }
  94. /*****************************************************************
  95. **【函数名称】 init
  96. **【函数功能】 初始化
  97. **【参数】
  98. **【返回值】
  99. ****************************************************************/
  100. bool CNetworkAcd::init( void )
  101. {
  102. // 初始化命令配置
  103. #ifdef _DEBUG
  104. CPduDataFormat::getInstance()->Load("../NetLib/PDUFormat.ini");
  105. #else
  106. CPduDataFormat::getInstance()->Load("./PDUFormat.ini");
  107. #endif
  108. // 注册事件响应接口
  109. CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE);
  110. CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE);
  111. // 连接到CTI
  112. CString Ip = CConfig::ctiIp();
  113. int Port = CConfig::ctiPort();
  114. // 创建SOCKET SERVER
  115. int ListenPort = CConfig::listenPort();
  116. if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(ListenPort, PDU_DEV_TYPE_ACD, 0))
  117. {
  118. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 创建网络服务端失败, ListenPort = %d"), ListenPort);
  119. return false;
  120. }
  121. if(!CInterfaceWindow::getIocpLinkInstance()->CreatePduClient(Ip, Port, PDU_DEV_TYPE_ACD, 0, PDU_DEV_TYPE_CTI, 0, true))
  122. {
  123. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Net}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
  124. return false;
  125. } // end if
  126. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Net}: 创建网络服务端成功, ListenPort = %d"), ListenPort);
  127. return true;
  128. }
  129. /*****************************************************************
  130. **【函数名称】 release
  131. **【函数功能】 连接释放
  132. **【参数】
  133. **【返回值】
  134. ****************************************************************/
  135. void CNetworkAcd::release( void )
  136. {
  137. CInterfaceWindow::getIocpLinkInstance()->StopAll();
  138. }
  139. /*****************************************************************
  140. **【函数名称】 send2Cti
  141. **【函数功能】 发送PDU到CTI
  142. **【参数】
  143. **【返回值】
  144. ****************************************************************/
  145. bool CNetworkAcd::send2Cti( CPduEntity* a_pPduEntity )
  146. {
  147. if(!m_IsCtiConnected)
  148. return false;
  149. CSingleLock Lock(&m_Lock4CTi, TRUE);
  150. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID) == TRUE;
  151. }
  152. /*****************************************************************
  153. **【函数名称】 send2Agent
  154. **【函数功能】 发送PDU到Agent
  155. **【参数】
  156. **【返回值】
  157. ****************************************************************/
  158. bool CNetworkAcd::send2Agent( int a_AgentId, CPduEntity* a_pPduEntity )
  159. {
  160. return CInterfaceWindow::getIocpCommInstance()->Send(a_pPduEntity, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  161. }
  162. /*****************************************************************
  163. **【函数名称】 getAgentLinkInfo
  164. **【函数功能】 获取Agent连接信息
  165. **【参数】
  166. **【返回值】
  167. ****************************************************************/
  168. bool CNetworkAcd::getAgentLinkInfo( int a_AgentId, CString& a_AgentIp, int& a_AgentPort )
  169. {
  170. return CInterfaceWindow::getIocpLinkInstance()->GetLinkInfo(a_AgentIp, a_AgentPort, PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  171. }
  172. /*****************************************************************
  173. **【函数名称】 shutDownAgentLink
  174. **【函数功能】 关闭Agent连接
  175. **【参数】
  176. **【返回值】
  177. ****************************************************************/
  178. bool CNetworkAcd::shutDownAgentLink( int a_AgentId )
  179. {
  180. return CInterfaceWindow::getIocpLinkInstance()->ClosePduClient(PDU_DEV_TYPE_AGENT, a_AgentId) == TRUE;
  181. }
  182. /*****************************************************************
  183. **【函数名称】 getPduSource
  184. **【函数功能】 获取PDU来源
  185. **【参数】
  186. **【返回值】
  187. ****************************************************************/
  188. bool CNetworkAcd::getPduSource( CPduEntity* a_pCmd, CString& a_SourceIp )
  189. {
  190. return CInterfaceWindow::getIocpLinkInstance()->GetPeerIp(a_SourceIp, a_pCmd) == TRUE;
  191. }