| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- #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;
- }
|