// ..\..\..\Public\PduLink\PduSocketMonitor.cpp : 实现文件 // #include "stdafx.h" #include "PduSocketMonitor.h" #include "PduSocket.h" #include "PduEntity.h" // CPduSocketMonitor IMPLEMENT_DYNAMIC(CPduSocketMonitor, CWnd) CPduSocketMonitor::CPduSocketMonitor(bool IsAutoReconnect) : m_IsAotoReconnect(IsAutoReconnect) { CreateEx(0, AfxRegisterWndClass(CS_GLOBALCLASS), "", 0, 0, 0, 0, 0, 0, 0); // 变量初始化 m_pParent = NULL; m_nLinkType = PDU_LINK_TYPE_SERVER; m_strFarIp.Empty(); m_nFarPort = 0; SetPeerDevInfo(PDU_DEV_TYPE_UNKNOWN, -1); } CPduSocketMonitor::~CPduSocketMonitor() { DestroyWindow(); } BEGIN_MESSAGE_MAP(CPduSocketMonitor, CWnd) ON_WM_TIMER() END_MESSAGE_MAP() /***************************************************************** **【函数名称】 SetLinkType **【函数功能】 设置连接类型(SOCKET初始化时调用) **【参数】 **【返回值】 ****************************************************************/ void CPduSocketMonitor::SetLinkType(PDU_LINK_TYPE a_nLinkType) { m_nLinkType = a_nLinkType; } /***************************************************************** **【函数名称】 GetLinkType **【函数功能】 读取连接类型 **【参数】 **【返回值】 ****************************************************************/ PDU_LINK_TYPE CPduSocketMonitor::GetLinkType() { return m_nLinkType; } /***************************************************************** **【函数名称】 GetPeerLinkInfo **【函数功能】 读取SOCKET连接信息 **【参数】 **【返回值】 a_strIp SOCKET对端IP a_nPort SOCKET对端PORT ****************************************************************/ void CPduSocketMonitor::GetPeerLinkInfo(CString& a_strIp, int& a_nPort) { a_strIp = m_strFarIp; a_nPort = m_nFarPort; } /***************************************************************** **【函数名称】 SetPeerLinkInfo **【函数功能】 设置SOCKET连接信息 **【参数】 a_strIp SOCKET对端IP a_nPort SOCKET对端PORT **【返回值】 ****************************************************************/ void CPduSocketMonitor::SetPeerLinkInfo(const CString& a_strIp, int a_nPort) { m_strFarIp = a_strIp; m_nFarPort = a_nPort; } /***************************************************************** **【函数名称】 GetPeerDevInfo **【函数功能】 读取对端设备信息 **【参数】 **【返回值】 a_nDevType 对端设备类型 a_nDevId 对端设备ID ****************************************************************/ void CPduSocketMonitor::GetPeerDevInfo(PDU_DEV_TYPE& a_nDevType, int& a_nDevId) { a_nDevType = m_nPeerDevType; a_nDevId = m_nPeerDevId; } /***************************************************************** **【函数名称】 SetPeerDevInfo **【函数功能】 设置对端设备信息 **【参数】 a_nDevType 对端设备类型 a_nDevId 对端设备ID **【返回值】 ****************************************************************/ void CPduSocketMonitor::SetPeerDevInfo(PDU_DEV_TYPE a_nDevType, int a_nDevId) { m_nPeerDevType = a_nDevType; m_nPeerDevId = a_nDevId; } /***************************************************************** **【函数名称】 OnConnEstablisthed **【函数功能】 SOCKET连接建立事件处理 **【参数】 a_pSocket 触发事件的SOCKET **【返回值】 ****************************************************************/ void CPduSocketMonitor::OnConnEstablisthed(CPduSocket* a_pSocket) { m_pParent = a_pSocket; // 设定SOCKET连接地址(用于监控管理) if(m_nLinkType == PDU_LINK_TYPE_SERVER) // 服务端 { a_pSocket->GetPeerName(m_strFarIp, m_nFarPort); } else // 客户端 { a_pSocket->Regist(); // 注册连接 } // end if } /***************************************************************** **【函数名称】 OnConnFailed **【函数功能】 SOCKET连接断开/失败事件处理 **【参数】 a_pSocket 触发事件的SOCKET **【返回值】 ****************************************************************/ void CPduSocketMonitor::OnConnFailed(CPduSocket* a_pSocket) { KillTimer(PDU_LISTEN_TIMER); if(m_nLinkType == PDU_LINK_TYPE_CLIENT && m_IsAotoReconnect) // 如果是客户端连接,则启动自动重连 { m_pParent = a_pSocket; SetTimer(PDU_RECONN_TIMER, VAL_RECONNECT_INTERVAL, NULL); // 启动自动重连定时器 } } /***************************************************************** **【函数名称】 OnConnRegistOK **【函数功能】 SOCKET连接注册成功事件处理 **【参数】 a_pSocket 触发事件的SOCKET **【返回值】 ****************************************************************/ void CPduSocketMonitor::OnConnRegistOK(CPduSocket* a_pSocket) { // 对OCX以外的所有设备端启用心跳监听 PDU_DEV_TYPE a_nDevType = PDU_DEV_TYPE_UNKNOWN; int a_nDevId = 0; m_pParent->GetLocalInfo(a_nDevType,a_nDevId); if(a_nDevType != PDU_DEV_TYPE_UNKNOWN && a_nDevType != PDU_DEV_TYPE_AGENT) { SetTimer(PDU_LISTEN_TIMER, VAL_LISTEN_INTERVAL, NULL); } } /***************************************************************** **【函数名称】 OnConnRegistFailed **【函数功能】 SOCKET连接注册失败事件处理 **【参数】 a_pSocket 触发事件的SOCKET **【返回值】 ****************************************************************/ void CPduSocketMonitor::OnConnRegistFailed(CPduSocket* a_pSocket) { } /***************************************************************** **【函数名称】 OnTimer **【函数功能】 自定重连定时器 **【参数】 **【返回值】 ****************************************************************/ void CPduSocketMonitor::OnTimer(UINT_PTR nIDEvent) { switch(nIDEvent) { case PDU_RECONN_TIMER: // 自动重连 { KillTimer(PDU_RECONN_TIMER); m_pParent->Connect(m_strFarIp, m_nFarPort); } break; case PDU_LISTEN_TIMER: // 心跳监听 { m_pParent->Monitor(); } break; } // end switch CWnd::OnTimer(nIDEvent); }