📄 entity_pt.cpp
字号:
#include "stdafx.h"
#include "entity_pt.h"
//本函数被socket线程调用
BOOL TPt_Entity::OnTcpDataInd(char Buff[],int BufLen) //收到TCP消息
{
STRUCT_TRP_MSG_HEADER *pHead;
DWORD dwMsgTye;
iSendLinkTestCount = 0;
pHead = (STRUCT_TRP_MSG_HEADER *)Buff;
dwMsgTye = ntohl(pHead->dwCommandId);
switch(dwMsgTye)
{
case TRP_CHANNEL_CONNECT_RSP:
LogTest("Rcv a TRP_PROTOCOLCONNECT_ACK message !\r\n");
if(pHead->dwStatus == 0)
SetEvent(m_LogSucc);//通知收到连接成功
break;
case TRP_NETREPORT_RSP:
LogTest("Rcv NET_REPORT_RSP from PT!\r\n");
iRcvLinkTestCount++;
break;
default:
if(MsgQue.push(Buff, BufLen)!=1)
LogErr("Entity_Pt Push message error!\r\n");
break;
}
return TRUE;
}
int TPt_Entity::Login() //登陆服务器,阻塞式登陆
{
char buf[200];
int bufLen;
//组连接登陆包connect_msg
STRUCT_CHANNEL_CONNECT struct_channel_connect;
ZeroMemory(&struct_channel_connect,sizeof(STRUCT_CHANNEL_CONNECT));
struct_channel_connect.sHeader.dwCommandId=htonl(TRP_CHANNEL_CONNECT);
struct_channel_connect.sHeader.dwTotalLen=htonl(sizeof(STRUCT_CHANNEL_CONNECT));
memcpy(&struct_channel_connect.szChannelName,gStructChannelInfo.szChannelName,sizeof(gStructChannelInfo.szChannelName));
memcpy(&struct_channel_connect.szPwd,gStructChannelInfo.szPwd,sizeof(gStructChannelInfo.szPwd));
struct_channel_connect.cChannelProtocol=gStructChannelInfo.ChannelProtocol;
struct_channel_connect.cChannelType=gStructChannelInfo.ChannelType;
memcpy(&buf,&struct_channel_connect,sizeof(STRUCT_CHANNEL_CONNECT));
bufLen=sizeof(STRUCT_CHANNEL_CONNECT);
LogTest("Send a TRP_PROTOCOLCONNECT message to PT !\r\n");
if((SendToTcp(buf, bufLen) )==TRUE)
{
if(WaitForSingleObject(m_LogSucc,5000)==0)//事件发生
{
m_LlcConnected = TRUE;//登陆成功
return TRUE;
}
}
return FALSE;
}
int TPt_Entity::Logout() //退出服务器
{
return 0;
}
BOOL TPt_Entity::SendLinkTest() //发送测试消息
{
STRUCT_LINKTEST LinkTest;
LinkTest.sHeader.dwCommandId = htonl(TRP_NETREPORT);
LinkTest.sHeader.dwSeqNo = 0;
if((gdw_RcvLinkNetStatus == 0) && (gdw_TransLinkNetStatus == 0))//正常
LinkTest.sHeader.dwStatus = 0;
else
LinkTest.sHeader.dwStatus = 1;
LinkTest.sHeader.dwTotalLen = htonl(16);
iSendLinkTestCount ++;
LogTest("Send NET_REPORT to PT!\r\n");
return(SendToTcp((char *)&LinkTest, 16));
}
#define LOOP_TIME 1000 //1 S
DWORD WINAPI PtCheckThread(LPVOID lpParam)
{
TPt_Entity* pEntity=(TPt_Entity*)lpParam;
int Loops=0;
DWORD dwOldRcvStatus=1;
DWORD dwOldTransStatus=1;
while(TRUE)
{
if(pEntity->m_TcpConnected == FALSE)//TCP未连接
{
gdw_PtLinkNetStatus = 1;
Sleep(2000);
continue;
}
if(pEntity->m_LlcConnected == FALSE)//协议实体未登陆
{
if(pEntity->Login() == FALSE)
{
gdw_PtLinkNetStatus = 1;
LogErr("Login AppAgent failure!\r\n");
Sleep(5000);
continue;
}
LogInf("Login AppAgent success!\r\n");
gdw_PtLinkNetStatus = 0;
}
if((dwOldRcvStatus != gdw_RcvLinkNetStatus) || (dwOldTransStatus !=gdw_TransLinkNetStatus))
{
dwOldRcvStatus = gdw_RcvLinkNetStatus;
dwOldTransStatus = gdw_TransLinkNetStatus;
Loops = 20000/LOOP_TIME + 1;//send link test imediately
}
if(Loops < 20000/LOOP_TIME )
{ Loops ++; Sleep(LOOP_TIME); continue; }
if( (!pEntity->SendLinkTest()) || (pEntity->iSendLinkTestCount > DELAY_TIME))
pEntity->RstTcp();
Loops = 0;
Sleep(1000);
}
return 0x11001100;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -