📄 serversocket.cpp
字号:
// ServerSocket.cpp: implementation of the CServerSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PTChannel.h"
#include "ServerSocket.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CPTChannelApp theApp;
//本函数被socket线程调用
extern TServerLink_Entity* g_pSgipEntity;
BOOL CServerSocket::OnTcpDataInd(char Buff[],int BufLen) //收到TCP消息
{
STRUCT_CMPP12_MSG_HEADER *pHead;
DWORD dwMsgTye;
for(int i=0;i<128;i++)
{
if(g_pSgipEntity->m_ServerSocket[i].Socket == m_hSocket)
{
g_pSgipEntity->m_ServerSocket[i].nIdle = 0;
break;
}
}
iSendLinkTestCount = 0;//用来判断协议实体连接是否正常
pHead = (STRUCT_CMPP12_MSG_HEADER *)Buff;
dwMsgTye = ntohl(pHead->dwCommand_ID);
switch(dwMsgTye)
{
case CMPP12_CONNECT:
STRUCT_SGIP_CONNECT *pMsg;
pMsg = (STRUCT_SGIP_CONNECT *)Buff;
LogTest("Rcv a ESME_BNDRCV from SgipLink !\r\n");
//???此处差登陆的密码、类型与登陆名的判断
Login_Rep();
break;
/* 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");
AfxMessageBox("Rcv a CMPP12_TERMINATE from CmppLink !\r\n");
SGIP_MSGHEAD* sUnbind = (SGIP_MSGHEAD*)Buff;
sUnbind->Command_ID = htonl(0x80000002);
SendToTcp((char*)sUnbind,sizeof(SGIP_MSGHEAD));
return FALSE;
break;
}
case CMPP12_TERMINATE_REP:
LogInf("Rcv a CMPP12_TERMINATE_REP from CmppLink !\r\n");
return FALSE;
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;
case SGIP_DELIVERY:
{
MoAdd();
LogMsg(Buff);//数出输出消息
STRUCT_DELIVERY sDelivery;
DELIVER* sSGIPDelivery = (DELIVER*)Buff;
STRUCT_SGIP_DELIVERY_REP sDeliveryRep;
ZeroMemory(&sDeliveryRep,sizeof(STRUCT_SGIP_DELIVERY_REP));
sDeliveryRep.sHeader.Command_ID = htonl(SGIP_DELIVERY_REP);
memcpy(&sDeliveryRep.sHeader.Sequence_ID,&sSGIPDelivery->sHeader.Sequence_ID,12);
sDeliveryRep.sHeader.Total_Length = htonl(sizeof(STRUCT_SGIP_DELIVERY_REP));
sDeliveryRep.btResult = 0;
SendToTcp((char*)&sDeliveryRep,sizeof(STRUCT_SGIP_DELIVERY_REP));
theApp.center->SGIP_Deliver(Buff,BufLen);
//Logout();
//return FALSE;
break;
}
case SGIP_REPORT:
{
LogMsg(Buff);//数出输出消息
STRUCT_MSG_REPORT sMsgReport;
STRUCT_SGIP_REPORT* sSGIPReport = (STRUCT_SGIP_REPORT*)Buff;
STRUCT_SGIP_REPORT_REP sReportRep;
ZeroMemory(&sReportRep,sizeof(STRUCT_SGIP_REPORT_REP));
sReportRep.sHeader.Command_ID = htonl(SGIP_REPORT_REP);
memcpy(&sReportRep.sHeader.Sequence_ID,&sSGIPReport->sHeader.Sequence_ID,12);
sReportRep.sHeader.Total_Length = htonl(sizeof(STRUCT_SGIP_REPORT_REP));
sReportRep.btResult = 0;
SendToTcp((char*)&sReportRep,ntohl(sReportRep.sHeader.Total_Length));
theApp.center->SGIP_Report(Buff,BufLen);
//Logout();
//return FALSE;
break;
}
default:
if(MsgQue.push(Buff, BufLen)!=1)
LogErr("ServerSocket Push message error!\r\n");
break;
}
return TRUE;
}
int CServerSocket::Login_Rep() //登陆服务器,阻塞式登陆
{
//登陆应用代理系统
/* 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);*/
//连接数据缓冲区
STRUCT_SGIP_CONNECT_REP con;
ZeroMemory(&con,sizeof con);
con.sHeader.Total_Length=htonl(sizeof STRUCT_SGIP_CONNECT_REP);
con.sHeader.Command_ID=htonl(0x80000001);//SGIP_BIND
con.sHeader.Sequence_ID.seq=htonl(1);
con.btResult = 0;//成功
if((SendToTcp((char*)&con,sizeof con) )==TRUE)
{
m_LlcConnected = TRUE;//登陆成功
return TRUE;
}
return FALSE;
}
int CServerSocket::Logout() //退出服务器
{
STRUCT_SGIP_TERMINAL sTerminal;
ZeroMemory(&sTerminal,sizeof(sTerminal));
sTerminal.sHeader.Total_Length = htonl(sizeof(STRUCT_SGIP_TERMINAL));
sTerminal.sHeader.Command_ID = htonl(SGIP_TERMINATE);
//changed by shijijiang
//福建联通协议SGIP1.2,按SGIP协议添加序列号。原节点编号(4字节)+时间(12字节)+序号(4字节)
//第一部分
//原节点编号 3AAAAQQQQQ 3059123008 福建区号0591 特符号 23008
//con.sHeader.Sequence_ID.srcseq = htonl(atoi(gStructTransInfo.szICPID));
sTerminal.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);
sTerminal.sHeader.Sequence_ID.systime = htonl( ldatetime );
//第三部分 序号
sTerminal.sHeader.Sequence_ID.seq=htonl(GET_SEQ_NO);
return(SendToTcp((char *)&sTerminal, sizeof(STRUCT_SGIP_TERMINAL)));
}
BOOL CServerSocket::SendLinkTest_Rep() //发送测试消息
{
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)));
}
extern DWORD g_dwAlarm;
DWORD WINAPI SgipLinkCheckThread(LPVOID lpParam)
{
TServerLink_Entity* pSgipSocket = (TServerLink_Entity*)lpParam;
while(TRUE)
{
for(int i=0;i<128;i++)
{
if(pSgipSocket->m_ServerSocket[i].bUsed == TRUE)
{
pSgipSocket->m_ServerSocket[i].nIdle++;
if(pSgipSocket->m_ServerSocket[i].nIdle > 30)
{
shutdown(pSgipSocket->m_ServerSocket[i].Socket,SD_BOTH);
closesocket(pSgipSocket->m_ServerSocket[i].Socket);
}
}
}
if((g_dwAlarm > 60) && (pSgipSocket->dwAlarm == 1))
{
g_dwAlarm = 0;
// pSgipSocket->SysBeep();
}
else
g_dwAlarm++;
Sleep(1000);
}
return 0x13001300;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -