多数据源中间件标准版1.0

NetworkAcd.cpp 6.9KB

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