#include "StdAfx.h" #include "PduSocketVector.h" #include "PduSocket.h" CPduSocketVector::CPduSocketVector(void) { m_pSocketDeleting = NULL; } CPduSocketVector::~CPduSocketVector(void) { Release(); } /***************************************************************** **【函数名称】 __OnConnFailedProc **【函数功能】 SOCKET连接断开/失败的后续处理 **【参数】 a_pSocket 连接断开/失败的SOCKET **【返回值】 ****************************************************************/ void CPduSocketVector::__OnConnFailedProc(CPduSocket* a_pSocket) { // 连接类型处理不同 if(a_pSocket->GetLinkType() == PDU_LINK_TYPE_CLIENT) { m_listConnecting.AddTail(a_pSocket); } else { if(m_pSocketDeleting != NULL) { delete m_pSocketDeleting; } // end if m_pSocketDeleting = a_pSocket; // 延迟删除 } // end if } /***************************************************************** **【函数名称】 __LookupSocket **【函数功能】 从LIST中查找指定的连接 **【参数】 a_nFarType 对端设备类型 a_nFarId 对端设备ID **【返回值】 ****************************************************************/ CPduSocket* CPduSocketVector::__LookupSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId, ListSocket& a_list) { POSITION pos = a_list.GetHeadPosition(); while(pos != NULL) { CPduSocket* pSocket = a_list.GetNext(pos); ASSERT(pSocket != NULL); PDU_DEV_TYPE nType = PDU_DEV_TYPE_UNKNOWN; int nId = -1; pSocket->GetPeerDevInfo(nType, nId); if(nType == a_nFarType && nId == a_nFarId) return pSocket; } // end while return NULL; } /***************************************************************** **【函数名称】 __LookupSocket **【函数功能】 从LIST中查找指定的连接 **【参数】 a_hSocket SOCKET句柄 **【返回值】 ****************************************************************/ CPduSocket* CPduSocketVector::__LookupSocket(SOCKET a_hSocket, ListSocket& a_list) { POSITION pos = a_list.GetHeadPosition(); while(pos != NULL) { CPduSocket* pSocket = a_list.GetNext(pos); ASSERT(pSocket != NULL); if(pSocket->m_hSocket == a_hSocket) return pSocket; } // end while return NULL; } /***************************************************************** **【函数名称】 __Lookup4Delete **【函数功能】 从LIST中查找指定的连接并删除 **【参数】 **【返回值】 ****************************************************************/ BOOL CPduSocketVector::__Lookup4Delete( PDU_DEV_TYPE a_nFarType, int a_nFarId, ListSocket& a_list ) { PDU_DEV_TYPE nType = PDU_DEV_TYPE_UNKNOWN; int nId = -1; POSITION pos = a_list.GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; CPduSocket* pSocket = a_list.GetNext(pos); pSocket->GetPeerDevInfo(nType, nId); if(nType == a_nFarType && nId == a_nFarId) { a_list.RemoveAt(posPrev); pSocket->Close(); // 延迟删除 if(m_pSocketDeleting != NULL) delete m_pSocketDeleting; m_pSocketDeleting = pSocket; return TRUE; } } // end while return FALSE; } /***************************************************************** **【函数名称】 __DeleteSocket **【函数功能】 从LIST中删除指定的连接 **【参数】 **【返回值】 ****************************************************************/ BOOL CPduSocketVector::__DeleteSocket(CPduSocket* a_pSocket, ListSocket& a_list) { ASSERT(a_pSocket != NULL); POSITION pos = a_list.GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; CPduSocket* pTmp = a_list.GetNext(pos); if(pTmp == a_pSocket) // 如果已经找到 { a_list.RemoveAt(posPrev); a_pSocket->Close(); // 延迟删除 if(m_pSocketDeleting != NULL) delete m_pSocketDeleting; m_pSocketDeleting = a_pSocket; return TRUE; } // end if } // end while return FALSE; } /***************************************************************** **【函数名称】 __RemoveSocket **【函数功能】 从LIST中移出指定的连接(不是删除) **【参数】 **【返回值】 ****************************************************************/ BOOL CPduSocketVector::__RemoveSocket(CPduSocket* a_pSocket, ListSocket& a_list) { ASSERT(a_pSocket != NULL); POSITION pos = a_list.GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; CPduSocket* pTmp = a_list.GetNext(pos); if(pTmp == a_pSocket) // 如果已经找到 { a_list.RemoveAt(posPrev); return TRUE; } // end if } // end while return FALSE; } /***************************************************************** **【函数名称】 InsertSocket **【函数功能】 添加一个新的连接 **【参数】 a_pSocket 要添加的连接 **【返回值】 ****************************************************************/ void CPduSocketVector::InsertSocket(CPduSocket* a_pSocket) { m_listConnecting.AddTail(a_pSocket); } /***************************************************************** **【函数名称】 RemoveSocket **【函数功能】 删除一个连接 **【参数】 **【返回值】 ****************************************************************/ BOOL CPduSocketVector::RemoveSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId) { // 注意此处的查找顺序:会影响到座席的重复签入控制!!! // 已注册的SOCKET if(__Lookup4Delete(a_nFarType, a_nFarId, m_listRegisted)) return TRUE; // 已连接的SOCKET if(__Lookup4Delete(a_nFarType, a_nFarId, m_listConnected)) return TRUE; // 正在连接的SOCKET if(__Lookup4Delete(a_nFarType, a_nFarId, m_listConnecting)) return TRUE; return FALSE; } /***************************************************************** **【函数名称】 GetPduSocket **【函数功能】 根据对端设备类型、ID查找指定连接 **【参数】 a_nFarType 对端设备类型 a_nFarId 对端设备ID **【返回值】 ****************************************************************/ CPduSocket* CPduSocketVector::GetPduSocket(PDU_DEV_TYPE a_nFarType, int a_nFarId) { // 正在连接的SOCKET CPduSocket* pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listConnecting); if(pSocket != NULL) return pSocket; // 已连接的SOCKET pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listConnected); if(pSocket != NULL) return pSocket; // 已注册的SOCKET pSocket = __LookupSocket(a_nFarType, a_nFarId, m_listRegisted); if(pSocket != NULL) return pSocket; return NULL; } /***************************************************************** **【函数名称】 GetPduSocket **【函数功能】 根据SOCKET句柄查找指定连接 **【参数】 a_hSocket SOCKET句柄 **【返回值】 ****************************************************************/ CPduSocket* CPduSocketVector::GetPduSocket(SOCKET a_hSocket) { CPduSocket* pSocket = NULL; pSocket = __LookupSocket(a_hSocket, m_listConnecting); if(pSocket != NULL) return pSocket; pSocket = __LookupSocket(a_hSocket, m_listConnected); if(pSocket != NULL) return pSocket; pSocket = __LookupSocket(a_hSocket, m_listRegisted); if(pSocket != NULL) return pSocket; return NULL; } /***************************************************************** **【函数名称】 OnConnEstablished **【函数功能】 连接建立事件处理 **【参数】 a_pSocket 已建立连接的SOCKET连接对象 a_nMonType 监控类型 **【返回值】 ****************************************************************/ PDU_LINK_STATE CPduSocketVector::OnConnEstablished(CPduSocket* a_pSocket) { PDU_LINK_STATE nLinkState = PDU_LINK_STATE_UNKNOWN; // 未知 if(a_pSocket->GetLinkType() == PDU_LINK_TYPE_SERVER) // SERVER端 { m_listConnected.AddTail(a_pSocket); nLinkState = PDU_LINK_STATE_ACCEPTED; } else // CLIENT端 { __RemoveSocket(a_pSocket, m_listConnecting); m_listConnected.AddTail(a_pSocket); nLinkState = PDU_LINK_STATE_SUCCESSED; } // end if return nLinkState; } /***************************************************************** **【函数名称】 OnConnFailed **【函数功能】 连接失败/断开事件处理 **【参数】 a_pSocket 已建立连接的SOCKET连接对象 **【返回值】 ****************************************************************/ PDU_LINK_STATE CPduSocketVector::OnConnFailed(CPduSocket* a_pSocket) { PDU_LINK_STATE nLinkState = PDU_LINK_STATE_UNKNOWN; // 未知 if(__RemoveSocket(a_pSocket, m_listRegisted)) // 正在进行通讯 { nLinkState = PDU_LINK_STATE_DISCONNECTED; __OnConnFailedProc(a_pSocket); // 后续处理 } else if(__RemoveSocket(a_pSocket, m_listConnected)) // 未握手 { nLinkState = PDU_LINK_STATE_DISCONNECTED; __OnConnFailedProc(a_pSocket); // 后续处理 } else if(__LookupSocket(a_pSocket->m_hSocket, m_listConnecting) != NULL) // 初次连接/重连 { nLinkState = PDU_LINK_STATE_FAILED; } else { ASSERT(FALSE); } // end if return nLinkState; } /***************************************************************** **【函数名称】 OnConnRegistOK **【函数功能】 连接注册成功事件处理 **【参数】 a_pSocket 已注册成功的SOCKET连接对象 **【返回值】 ****************************************************************/ PDU_LINK_STATE CPduSocketVector::OnConnRegistOK(CPduSocket* a_pSocket) { CPduSocket* pTmp = NULL; __RemoveSocket(a_pSocket, m_listConnected); m_listRegisted.AddTail(a_pSocket); return PDU_LINK_STATE_REG_OK; } /***************************************************************** **【函数名称】 OnConnRegistFailed **【函数功能】 连接注册失败事件处理 **【参数】 a_pSocket 已注册失败的SOCKET连接对象 **【返回值】 ****************************************************************/ PDU_LINK_STATE CPduSocketVector::OnConnRegistFailed(CPduSocket* a_pSocket) { return PDU_LINK_STATE_REG_FAILED; } /***************************************************************** **【函数名称】 Send2All **【函数功能】 向所有注册过的客户端发送PDU **【参数】 **【返回值】 ****************************************************************/ void CPduSocketVector::Send2All( CPduEntity* a_pPdu ) { POSITION pos = m_listRegisted.GetHeadPosition(); while(pos != NULL) { CPduSocket* pSocket = m_listRegisted.GetNext(pos); ASSERT(pSocket != NULL); pSocket->SendPdu(a_pPdu); } // end while } /***************************************************************** **【函数名称】 Release **【函数功能】 释放资源 **【参数】 **【返回值】 ****************************************************************/ void CPduSocketVector::Release( void ) { while(!m_listConnecting.IsEmpty()) { delete m_listConnecting.RemoveHead(); } while(!m_listConnected.IsEmpty()) { delete m_listConnected.RemoveHead(); } while(!m_listRegisted.IsEmpty()) { delete m_listRegisted.RemoveHead(); } if(m_pSocketDeleting != NULL) delete m_pSocketDeleting; }