📄 entity_cmpplink.cpp
字号:
// TCmppLink_Entity.cpp: implementation of the TCmppLink_Entity class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PTChannel.h"
#include "Entity_CmppLink.h"
//#include <stdlib.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern DWORD g_dwLogin;
//本函数被socket线程调用
BOOL TCmppLink_Entity::OnTcpDataInd(char Buff[],int BufLen) //收到TCP消息
{
STRUCT_CMPP12_MSG_HEADER *pHead;
DWORD dwMsgTye;
iSendLinkTestCount = 0;//用来判断协议实体连接是否正常
pHead = (STRUCT_CMPP12_MSG_HEADER *)Buff;
dwMsgTye = ntohl(pHead->dwCommand_ID);
switch(dwMsgTye)
{
case CMPP12_CONNECT_REP:
STRUCT_SGIP_CONNECT_REP *pMsg;
pMsg = (STRUCT_SGIP_CONNECT_REP *)Buff;
LogTest("Rcv a ESME_BNDRCV_RESP from CmppLink !\r\n");
if(pMsg->btResult == BYTE(E_SUCCESS))
SetEvent(m_LogSucc);//通知收到连接成功
break;
case CMPP12_TERMINATE:
LogTest("Rcv a CMPP12_TERMINATE from CmppLink !\r\n");
break;
case CMPP12_TERMINATE_REP:
LogTest("Rcv a CMPP12_TERMINATE_REP from CmppLink !\r\n");
break;
case CMPP12_ACTIVE_TEST:
LogTest("Rcv a CMPP12_ACTIVE_TEST from CmppLink !\r\n");
// SendLinkTestRsp();
break;
case CMPP12_ACTIVE_TEST_REP:
LogTest("Rcv a CMPP12_ACTIVE_TEST_REP from CmppLink !\r\n");
break;
default:
if(MsgQue.push(Buff, BufLen)!=1)
LogErr("Entity_CmppLink Push message error!\r\n");
break;
}
return TRUE;
}
int TCmppLink_Entity::Login() //登陆服务器,阻塞式登陆
{
//连接数据缓冲区
char szbuf[200];
STRUCT_SGIP_CONNECT con;
ZeroMemory(szbuf,sizeof(szbuf));
ZeroMemory(&con,sizeof con);
con.sHeader.Total_Length=htonl(sizeof con);
con.sHeader.Command_ID=htonl(0x1);//SGIP_BIND
//changed by shijijiang
//福建联通协议SGIP1.2,按SGIP协议添加序列号。原节点编号(4字节)+时间(12字节)+序号(4字节)
//第一部分
//原节点编号 3AAAAQQQQQ 3059123008 福建区号0591 特符号 23008
//con.sHeader.Sequence_ID.srcseq = htonl(atoi(gStructTransInfo.szICPID));
con.sHeader.Sequence_ID.srcseq = htonl(3059123008);
//第二部分 时间
time_t datetime;
time( &datetime );
char temp[12];
strftime(&temp[0], 12, "%m%d%H%M%S",localtime(&datetime));
unsigned long ldatetime;
ldatetime=atol(temp);
con.sHeader.Sequence_ID.systime = htonl( ldatetime );
//第三部分 序号
con.sHeader.Sequence_ID.seq=htonl(1);
//接口ID,ICPID
strcpy(con.AuthenticatorICP,gStructTransInfo.szPAS);
con.longin_type=1;
strcpy(con.Source_Addr,gStructTransInfo.szICPID);
memcpy(szbuf,&con,sizeof con);
if((SendToTcp(szbuf,sizeof con) )==TRUE)
{
if(WaitForSingleObject(m_LogSucc,5000)==0)//事件发生
{
m_LlcConnected = TRUE;//登陆成功
g_dwLogin = 1;
return TRUE;
}
}
return FALSE;
}
int TCmppLink_Entity::Logout() //退出服务器
{
return 0;
}
BOOL TCmppLink_Entity::SendLinkTest() //发送测试消息
{
STRUCT_CMPP12_ACTIVE_TEST cmpp_active_test;
ZeroMemory(&cmpp_active_test,sizeof(STRUCT_CMPP12_ACTIVE_TEST));
cmpp_active_test.sHeader.dwCommand_ID=htonl(CMPP12_ACTIVE_TEST);
cmpp_active_test.sHeader.dwSequence_ID=htonl(GET_SEQ_NO);
cmpp_active_test.sHeader.dwTotal_Length=htonl(12);
iSendLinkTestCount ++;
return(SendToTcp((char *)&cmpp_active_test, sizeof(STRUCT_CMPP12_ACTIVE_TEST)));
}
#define LOOP_TIME 5000
extern DWORD g_dwLogin;
DWORD WINAPI CmppLinkCheckThread(LPVOID lpParam)
{
int Loops = 0;
TCmppLink_Entity* pEntity=(TCmppLink_Entity*)lpParam;
while(TRUE)
{
if(pEntity->m_TcpConnected == FALSE)//TCP未连接
{
gdw_CmppLinkNetStatus = 1;
g_dwLogin = 0;
Sleep(2000);
continue;
}
if(pEntity->m_LlcConnected == FALSE)//协议实体未登陆
{
if(pEntity->Login() == FALSE)
{
//发送连接失败通知消息
gdw_CmppLinkNetStatus = 1;
g_dwLogin = 0;
LogErr("Login CmppLink failure!\r\n");
Sleep(3000);
continue;
}
LogInf("Login CmppLink success!\r\n");
//发送连接成功通知消息
gdw_CmppLinkNetStatus = 0;
}
if(pEntity->LinkStatusChanged())
{
Loops = 20000/LOOP_TIME + 1;//send link test imediately
pEntity->ResetLinkStatus();
}
if(Loops < (20000/LOOP_TIME ))
{ Loops ++; Sleep(LOOP_TIME); continue; }
// if( (!pEntity->SendLinkTest()) ||(pEntity->iSendLinkTestCount> DELAY_TIME))
// pEntity->RstTcp();
Sleep(1000);
Loops = 0;
}
return 0x13001300;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -