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

PduSocketVector.cpp 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. #include "StdAfx.h"
  2. #include "PduSocketVector.h"
  3. #include "PduSocket.h"
  4. CPduSocketVector::CPduSocketVector(void)
  5. {
  6. m_pSocketDeleting = NULL;
  7. }
  8. CPduSocketVector::~CPduSocketVector(void)
  9. {
  10. Release();
  11. }
  12. /*****************************************************************
  13. **【函数名称】 __OnConnFailedProc
  14. **【函数功能】 SOCKET连接断开/失败的后续处理
  15. **【参数】 a_pSocket 连接断开/失败的SOCKET
  16. **【返回值】
  17. ****************************************************************/
  18. void CPduSocketVector::__OnConnFailedProc(CPduSocket* a_pSocket)
  19. {
  20. // 连接类型处理不同
  21. if(a_pSocket->GetLinkType() == PDU_LINK_TYPE_CLIENT)
  22. {
  23. m_listConnecting.AddTail(a_pSocket);
  24. }
  25. else
  26. {
  27. if(m_pSocketDeleting != NULL)
  28. {
  29. delete m_pSocketDeleting;
  30. } // end if
  31. m_pSocketDeleting = a_pSocket; // 延迟删除
  32. } // end if
  33. }
  34. /*****************************************************************
  35. **【函数名称】 __LookupSocket
  36. **【函数功能】 从LIST中查找指定的连接
  37. **【参数】 a_nFarType 对端设备类型
  38. a_nFarId 对端设备ID
  39. **【返回值】
  40. ****************************************************************/
  41. CPduSocket* CPduSocketVector::__LookupSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId, ListSocket& a_list)
  42. {
  43. POSITION pos = a_list.GetHeadPosition();
  44. while(pos != NULL)
  45. {
  46. CPduSocket* pSocket = a_list.GetNext(pos);
  47. ASSERT(pSocket != NULL);
  48. PDU_DEV_TYPE nType = PDU_DEV_TYPE_UNKNOWN;
  49. int nId = -1;
  50. pSocket->GetPeerDevInfo(nType, nId);
  51. if(nType == a_nFarType && nId == a_nFarId) return pSocket;
  52. } // end while
  53. return NULL;
  54. }
  55. /*****************************************************************
  56. **【函数名称】 __LookupSocket
  57. **【函数功能】 从LIST中查找指定的连接
  58. **【参数】 a_hSocket SOCKET句柄
  59. **【返回值】
  60. ****************************************************************/
  61. CPduSocket* CPduSocketVector::__LookupSocket(SOCKET a_hSocket, ListSocket& a_list)
  62. {
  63. POSITION pos = a_list.GetHeadPosition();
  64. while(pos != NULL)
  65. {
  66. CPduSocket* pSocket = a_list.GetNext(pos);
  67. ASSERT(pSocket != NULL);
  68. if(pSocket->m_hSocket == a_hSocket) return pSocket;
  69. } // end while
  70. return NULL;
  71. }
  72. /*****************************************************************
  73. **【函数名称】 __Lookup4Delete
  74. **【函数功能】 从LIST中查找指定的连接并删除
  75. **【参数】
  76. **【返回值】
  77. ****************************************************************/
  78. BOOL CPduSocketVector::__Lookup4Delete( PDU_DEV_TYPE a_nFarType, int a_nFarId, ListSocket& a_list )
  79. {
  80. PDU_DEV_TYPE nType = PDU_DEV_TYPE_UNKNOWN;
  81. int nId = -1;
  82. POSITION pos = a_list.GetHeadPosition();
  83. while(pos != NULL)
  84. {
  85. POSITION posPrev = pos;
  86. CPduSocket* pSocket = a_list.GetNext(pos);
  87. pSocket->GetPeerDevInfo(nType, nId);
  88. if(nType == a_nFarType && nId == a_nFarId)
  89. {
  90. a_list.RemoveAt(posPrev);
  91. pSocket->Close();
  92. // 延迟删除
  93. if(m_pSocketDeleting != NULL) delete m_pSocketDeleting;
  94. m_pSocketDeleting = pSocket;
  95. return TRUE;
  96. }
  97. } // end while
  98. return FALSE;
  99. }
  100. /*****************************************************************
  101. **【函数名称】 __DeleteSocket
  102. **【函数功能】 从LIST中删除指定的连接
  103. **【参数】
  104. **【返回值】
  105. ****************************************************************/
  106. BOOL CPduSocketVector::__DeleteSocket(CPduSocket* a_pSocket, ListSocket& a_list)
  107. {
  108. ASSERT(a_pSocket != NULL);
  109. POSITION pos = a_list.GetHeadPosition();
  110. while(pos != NULL)
  111. {
  112. POSITION posPrev = pos;
  113. CPduSocket* pTmp = a_list.GetNext(pos);
  114. if(pTmp == a_pSocket) // 如果已经找到
  115. {
  116. a_list.RemoveAt(posPrev);
  117. a_pSocket->Close();
  118. // 延迟删除
  119. if(m_pSocketDeleting != NULL) delete m_pSocketDeleting;
  120. m_pSocketDeleting = a_pSocket;
  121. return TRUE;
  122. } // end if
  123. } // end while
  124. return FALSE;
  125. }
  126. /*****************************************************************
  127. **【函数名称】 __RemoveSocket
  128. **【函数功能】 从LIST中移出指定的连接(不是删除)
  129. **【参数】
  130. **【返回值】
  131. ****************************************************************/
  132. BOOL CPduSocketVector::__RemoveSocket(CPduSocket* a_pSocket, ListSocket& a_list)
  133. {
  134. ASSERT(a_pSocket != NULL);
  135. POSITION pos = a_list.GetHeadPosition();
  136. while(pos != NULL)
  137. {
  138. POSITION posPrev = pos;
  139. CPduSocket* pTmp = a_list.GetNext(pos);
  140. if(pTmp == a_pSocket) // 如果已经找到
  141. {
  142. a_list.RemoveAt(posPrev);
  143. return TRUE;
  144. } // end if
  145. } // end while
  146. return FALSE;
  147. }
  148. /*****************************************************************
  149. **【函数名称】 InsertSocket
  150. **【函数功能】 添加一个新的连接
  151. **【参数】 a_pSocket 要添加的连接
  152. **【返回值】
  153. ****************************************************************/
  154. void CPduSocketVector::InsertSocket(CPduSocket* a_pSocket)
  155. {
  156. m_listConnecting.AddTail(a_pSocket);
  157. }
  158. /*****************************************************************
  159. **【函数名称】 RemoveSocket
  160. **【函数功能】 删除一个连接
  161. **【参数】
  162. **【返回值】
  163. ****************************************************************/
  164. BOOL CPduSocketVector::RemoveSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId)
  165. {
  166. // 注意此处的查找顺序:会影响到座席的重复签入控制!!!
  167. // 已注册的SOCKET
  168. if(__Lookup4Delete(a_nFarType, a_nFarId, m_listRegisted))
  169. return TRUE;
  170. // 已连接的SOCKET
  171. if(__Lookup4Delete(a_nFarType, a_nFarId, m_listConnected))
  172. return TRUE;
  173. // 正在连接的SOCKET
  174. if(__Lookup4Delete(a_nFarType, a_nFarId, m_listConnecting))
  175. return TRUE;
  176. return FALSE;
  177. }
  178. /*****************************************************************
  179. **【函数名称】 GetPduSocket
  180. **【函数功能】 根据对端设备类型、ID查找指定连接
  181. **【参数】 a_nFarType 对端设备类型
  182. a_nFarId 对端设备ID
  183. **【返回值】
  184. ****************************************************************/
  185. CPduSocket* CPduSocketVector::GetPduSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId)
  186. {
  187. // 正在连接的SOCKET
  188. CPduSocket* pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listConnecting);
  189. if(pSocket != NULL) return pSocket;
  190. // 已连接的SOCKET
  191. pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listConnected);
  192. if(pSocket != NULL) return pSocket;
  193. // 已注册的SOCKET
  194. pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listRegisted);
  195. if(pSocket != NULL) return pSocket;
  196. return NULL;
  197. }
  198. /*****************************************************************
  199. **【函数名称】 GetPduSocket
  200. **【函数功能】 根据SOCKET句柄查找指定连接
  201. **【参数】 a_hSocket SOCKET句柄
  202. **【返回值】
  203. ****************************************************************/
  204. CPduSocket* CPduSocketVector::GetPduSocket(SOCKET a_hSocket)
  205. {
  206. CPduSocket* pSocket = NULL;
  207. pSocket = __LookupSocket(a_hSocket, m_listConnecting);
  208. if(pSocket != NULL) return pSocket;
  209. pSocket = __LookupSocket(a_hSocket, m_listConnected);
  210. if(pSocket != NULL) return pSocket;
  211. pSocket = __LookupSocket(a_hSocket, m_listRegisted);
  212. if(pSocket != NULL) return pSocket;
  213. return NULL;
  214. }
  215. /*****************************************************************
  216. **【函数名称】 OnConnEstablished
  217. **【函数功能】 连接建立事件处理
  218. **【参数】 a_pSocket 已建立连接的SOCKET连接对象
  219. a_nMonType 监控类型
  220. **【返回值】
  221. ****************************************************************/
  222. PDU_LINK_STATE CPduSocketVector::OnConnEstablished(CPduSocket* a_pSocket)
  223. {
  224. PDU_LINK_STATE nLinkState = PDU_LINK_STATE_UNKNOWN; // 未知
  225. if(a_pSocket->GetLinkType() == PDU_LINK_TYPE_SERVER) // SERVER端
  226. {
  227. m_listConnected.AddTail(a_pSocket);
  228. nLinkState = PDU_LINK_STATE_ACCEPTED;
  229. }
  230. else // CLIENT端
  231. {
  232. __RemoveSocket(a_pSocket, m_listConnecting);
  233. m_listConnected.AddTail(a_pSocket);
  234. nLinkState = PDU_LINK_STATE_SUCCESSED;
  235. } // end if
  236. return nLinkState;
  237. }
  238. /*****************************************************************
  239. **【函数名称】 OnConnFailed
  240. **【函数功能】 连接失败/断开事件处理
  241. **【参数】 a_pSocket 已建立连接的SOCKET连接对象
  242. **【返回值】
  243. ****************************************************************/
  244. PDU_LINK_STATE CPduSocketVector::OnConnFailed(CPduSocket* a_pSocket)
  245. {
  246. PDU_LINK_STATE nLinkState = PDU_LINK_STATE_UNKNOWN; // 未知
  247. if(__RemoveSocket(a_pSocket, m_listRegisted)) // 正在进行通讯
  248. {
  249. nLinkState = PDU_LINK_STATE_DISCONNECTED;
  250. __OnConnFailedProc(a_pSocket); // 后续处理
  251. }
  252. else if(__RemoveSocket(a_pSocket, m_listConnected)) // 未握手
  253. {
  254. nLinkState = PDU_LINK_STATE_DISCONNECTED;
  255. __OnConnFailedProc(a_pSocket); // 后续处理
  256. }
  257. else if(__LookupSocket(a_pSocket->m_hSocket, m_listConnecting) != NULL) // 初次连接/重连
  258. {
  259. nLinkState = PDU_LINK_STATE_FAILED;
  260. }
  261. else
  262. {
  263. ASSERT(FALSE);
  264. } // end if
  265. return nLinkState;
  266. }
  267. /*****************************************************************
  268. **【函数名称】 OnConnRegistOK
  269. **【函数功能】 连接注册成功事件处理
  270. **【参数】 a_pSocket 已注册成功的SOCKET连接对象
  271. **【返回值】
  272. ****************************************************************/
  273. PDU_LINK_STATE CPduSocketVector::OnConnRegistOK(CPduSocket* a_pSocket)
  274. {
  275. CPduSocket* pTmp = NULL;
  276. __RemoveSocket(a_pSocket, m_listConnected);
  277. m_listRegisted.AddTail(a_pSocket);
  278. return PDU_LINK_STATE_REG_OK;
  279. }
  280. /*****************************************************************
  281. **【函数名称】 OnConnRegistFailed
  282. **【函数功能】 连接注册失败事件处理
  283. **【参数】 a_pSocket 已注册失败的SOCKET连接对象
  284. **【返回值】
  285. ****************************************************************/
  286. PDU_LINK_STATE CPduSocketVector::OnConnRegistFailed(CPduSocket* a_pSocket)
  287. {
  288. return PDU_LINK_STATE_REG_FAILED;
  289. }
  290. /*****************************************************************
  291. **【函数名称】 Send2All
  292. **【函数功能】 向所有注册过的客户端发送PDU
  293. **【参数】
  294. **【返回值】
  295. ****************************************************************/
  296. void CPduSocketVector::Send2All( CPduEntity* a_pPdu )
  297. {
  298. POSITION pos = m_listRegisted.GetHeadPosition();
  299. while(pos != NULL)
  300. {
  301. CPduSocket* pSocket = m_listRegisted.GetNext(pos);
  302. ASSERT(pSocket != NULL);
  303. pSocket->SendPdu(a_pPdu);
  304. } // end while
  305. }
  306. /*****************************************************************
  307. **【函数名称】 Release
  308. **【函数功能】 释放资源
  309. **【参数】
  310. **【返回值】
  311. ****************************************************************/
  312. void CPduSocketVector::Release( void )
  313. {
  314. while(!m_listConnecting.IsEmpty())
  315. {
  316. delete m_listConnecting.RemoveHead();
  317. }
  318. while(!m_listConnected.IsEmpty())
  319. {
  320. delete m_listConnected.RemoveHead();
  321. }
  322. while(!m_listRegisted.IsEmpty())
  323. {
  324. delete m_listRegisted.RemoveHead();
  325. }
  326. if(m_pSocketDeleting != NULL)
  327. delete m_pSocketDeleting;
  328. }