📄 smcsocket.cpp
字号:
// SMCSocket.cpp: implementation of the CSMCSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "VSMSCNEW.h"
#include "SMCSocket.h"
#include "ConstDef.h"
#include "Global.h"
#include "DevLinkManager.h"
#include "VSMSCNEWDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
extern CVSMSCNEWDlg* gpDlg;
CSMCSocket::CSMCSocket():CZSocket(TRUE)
{
bNewSocket=TRUE;
m_bRecvLink=FALSE;
}
CSMCSocket::~CSMCSocket()
{
bNewSocket=FALSE;
}
BOOL CSMCSocket::OnDisconnect()
{
this->CloseSocket();
bNewSocket=TRUE;
if(m_bRecvLink)
{
AddToMsgLog("接收链路连接断开!");
//gpDlg->RemoveChannel(TRUE); lyy 2002-08-06
}else
{
AddToMsgLog("发送链路连接断开!");
//gpDlg->RemoveChannel(FALSE); lyy 2002-08-06
}
return TRUE;
}
void CSMCSocket::OnConnected()
{
}
//接收消息函数
BOOL CSMCSocket::ReceiveMsg(char pszBuf[],UINT puBufLen,UINT puCommandID,UINT puSequenceID)
{
MESSAGE_HEADER* pHeader=(MESSAGE_HEADER*)pszBuf;
switch(ntohl(pHeader->command_id))
{
case ESME_BNDRCV:
{
CONNECTREP sRep;
ZeroMemory(&sRep,sizeof(CONNECTREP));
char szSystemId[17];
strcpy(szSystemId,&pszBuf[16]);
sRep.sHeader.command_id=htonl(ESME_BNDRCV_RESP);
sRep.sHeader.command_length=htonl(SM_MESSAGE_HEAD_SIZE+strlen(szSystemId));
sRep.sHeader.sequence_no=pHeader->sequence_no;
strcpy(sRep.szSystemId,szSystemId);
m_bRecvLink=TRUE;
if(SendMsg((char*)&sRep,ntohl(sRep.sHeader.command_length)))
{
AddToMsgLog("接收链路登录成功!");
//gpDlg->AddChannel(TRUE); lyy 2002-08-06
}
}break;
case ESME_BNDTRN:
{
CONNECTREP sRep;
m_bRecvLink=FALSE;
ZeroMemory(&sRep,sizeof(CONNECTREP));
char szSystemId[17];
strcpy(szSystemId,&pszBuf[16]);
sRep.sHeader.command_id=htonl(ESME_BNDTRN_RESP);
sRep.sHeader.command_length=htonl(SM_MESSAGE_HEAD_SIZE+strlen(szSystemId));
sRep.sHeader.sequence_no=pHeader->sequence_no;
strcpy(sRep.szSystemId,szSystemId);
if(SendMsg((char*)&sRep,ntohl(sRep.sHeader.command_length)))
{
AddToMsgLog("发送链路登录成功!");
//gpDlg->AddChannel(FALSE); lyy 2002-08-06
}
}break;
case ESME_UBD:
{
if(m_bRecvLink)
{
AddToMsgLog("接收链路连接断开!");
//gpDlg->RemoveChannel(TRUE); lyy 2002-08-06
}else
{
AddToMsgLog("发送链路连接断开!");
//gpDlg->RemoveChannel(FALSE); lyy 2002-08-06
}
}break;
case ESME_SUB_SM:
{
SUBMIT_REP sSubmitRep;
DWORD dwMsgID=GetSEQID();
char szMsgID[20];
ZeroMemory(szMsgID,sizeof(szMsgID));
ZeroMemory(&sSubmitRep,sizeof(SUBMIT_REP));
sSubmitRep.sHeader.sequence_no=pHeader->sequence_no;
sSubmitRep.sHeader.command_id=htonl(ESME_SUB_SM_RESP);
sprintf(sSubmitRep.szMsgId,"%x",dwMsgID);
sprintf(szMsgID,"%d",dwMsgID);
sSubmitRep.sHeader.command_length=htonl(SM_MESSAGE_HEAD_SIZE+strlen(sSubmitRep.szMsgId));
SendMsg((char*)&sSubmitRep,ntohl(sSubmitRep.sHeader.command_length));
Sleep(10);
STRUCT_SMPP_SUBMIT struct_smpp_submit;
ZeroMemory(&struct_smpp_submit,sizeof(STRUCT_SMPP_SUBMIT));
GetSmppDataFromBuf(&struct_smpp_submit,pszBuf,ESME_SUB_SM);
if(SendToDev(struct_smpp_submit))
{
if(struct_smpp_submit.cRegistered_deliver_flag)
{
AddToMsgLog("回应Submit成功状态报告!");
//回应MSgRep
SendDeliverMsg("",0,struct_smpp_submit.szSource_addr,struct_smpp_submit.szDest_addr,szMsgID,TRUE,0);
}
}else
{
if(struct_smpp_submit.cRegistered_deliver_flag)
{
AddToMsgLog("回应Submit失败状态报告!");
SendDeliverMsg("",0,struct_smpp_submit.szSource_addr,struct_smpp_submit.szDest_addr,szMsgID,TRUE,SEND_ERROR);
}
}
//发送状态报告
}break;
case ESME_DELIVER_SM_RESP:
{
AddToMsgLog("收到DELIVER_SM_RESP!");
}break;
case ESME_QRYLINK:
{
MESSAGE_HEADER sHead;
sHead.command_length=htonl(16);
sHead.command_id=htonl(ESME_QRYLINK_RESP);
sHead.command_status=htonl(0);
sHead.sequence_no=pHeader->sequence_no;
SendMsg((char*)&sHead,sizeof(MESSAGE_HEADER));
}
case ESME_QRYLINK_RESP:
{
/* MESSAGE_HEADER sHead;
sHead.command_length=htonl(16);
sHead.command_id=htonl(ESME_QRYLINK);
sHead.command_status=htonl(0);
sHead.sequence_no=htonl(GetSEQID());
SendMsg((char*)&sHead,sizeof(MESSAGE_HEADER)); */
}break;
default:
break;
}
return TRUE;
}
BOOL CSMCSocket::SendToDev(STRUCT_SMPP_SUBMIT &sSubmit)
{
return g_pDevLinkManager->SendToDev(sSubmit);
}
BOOL CSMCSocket::SendDeliverMsg(char *szMsgContent, short sMsgLen,char *szSrcID, char *szDestID,
char *szMsgID, BOOL bMsgRep,DWORD dwStatus)
{
MESSAGE_HEADER MessageHeader;
char szSendBuf[1024];
char szMsg[256];
short Msglen=0;
ZeroMemory(szSendBuf,sizeof(szSendBuf));
ZeroMemory(szMsg,sizeof(szMsg));
if(bMsgRep)
{
char* pPos=szMsg;
Msglen=strlen(szMsgID);
memcpy(szMsg,szMsgID,Msglen);
pPos=szMsg+Msglen+1;
memcpy(pPos,"00",2);
pPos+=3;
memcpy(pPos,"001",3);
pPos+=3;
memcpy(pPos,"0000000000",10);
pPos+=10;
memcpy(pPos,"0000000000",10);
pPos+=10;
memcpy(pPos,"0000000",7);
pPos+=7;
if(dwStatus)
memcpy(pPos,"111",3);
else
memcpy(pPos,"000",3);
Msglen+=37;
}else
{
Msglen=sMsgLen;
memcpy(szMsg,szMsgContent,Msglen);
}
ZeroMemory(&MessageHeader,sizeof(MESSAGE_HEADER));
MessageHeader.command_id=htonl(ESME_DELIVER_SM);
MessageHeader.command_status=htonl(dwStatus);
MessageHeader.sequence_no=htonl(GetSEQID());
unsigned short uPos=16;
uPos=16;
memcpy(szSendBuf,&MessageHeader,16);
uPos++;
szSendBuf[uPos]=0;
uPos++;
szSendBuf[uPos]=0;
uPos++;
strcpy(&szSendBuf[uPos],szSrcID);
uPos+=strlen(szSrcID)+1;
szSendBuf[uPos]=0;
uPos++;
szSendBuf[uPos]=0;
uPos++;
strcpy(&szSendBuf[uPos],szDestID);
uPos+=strlen(szDestID)+1;
if(bMsgRep)
szSendBuf[uPos]=4;//状态报告标准
else
szSendBuf[uPos]=0;
uPos++;
uPos++;
uPos++;
//strcpy(&szSendBuf[uPos],SM_Packet.schedule_time);
uPos++;//=strlen(SM_Packet.schedule_time)+1;
//strcpy(&szSendBuf[uPos],SM_Packet.validity_time);
uPos++;//=strlen(SM_Packet.validity_time)+1;
szSendBuf[uPos]=bMsgRep;//状态报告标志
uPos++;
uPos++;
if(!bMsgRep)
szSendBuf[uPos]=(BYTE)245;//fmt
uPos++;
uPos++;
szSendBuf[uPos]=(BYTE)Msglen;
uPos++;
memcpy(&szSendBuf[uPos],szMsg,Msglen);
*(unsigned long*)szSendBuf=htonl(uPos+Msglen);
return g_pDevLinkManager->SendMsgWithRecv(szSendBuf,uPos+Msglen);
}
//通过消息包,获取消息内容
void CSMCSocket::GetSmppDataFromBuf(void* ReceiveBuf,char* buf,UINT nCommandID)
{
switch(nCommandID)
{
case ESME_SUB_SM:
case ESME_DELIVER_SM://Deliver消息
{
int nCurrentPos=0;
//SMPP数据包分析
STRUCT_SMPP_DELIVER *psmpp_deliver=(STRUCT_SMPP_DELIVER *)ReceiveBuf;
//消息头,网络字节未经转换
memcpy(&(psmpp_deliver->sHeader),buf,sizeof(MESSAGE_HEADER));
//消息体的第一字节
nCurrentPos=16;
//service_type;
int len=StrnCopy(psmpp_deliver->szSerice_type,6,&buf[nCurrentPos]);
nCurrentPos=nCurrentPos+len+1;
//source_addr_ton
psmpp_deliver->cSource_addr_ton=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//source_addr_npi;
psmpp_deliver->cSource_addr_npi=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//source_addr;
len=StrnCopy(psmpp_deliver->szSource_addr,21,&buf[nCurrentPos]);
nCurrentPos=nCurrentPos+len+1;
//dest_addr_ton
psmpp_deliver->cDest_addr_ton=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//dest_addr_npi
psmpp_deliver->cDest_addr_npi=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//dest_addr
len=StrnCopy(psmpp_deliver->szDest_addr,21,&buf[nCurrentPos]);
nCurrentPos=nCurrentPos+len+1;
//esm_class
psmpp_deliver->cEsm_class=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//protocol_id
psmpp_deliver->cProtocol_id=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//priority_flag
psmpp_deliver->cPriority_flag=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//schedule_deliver_time
len=StrnCopy(psmpp_deliver->szSchedule_delivery_time,21,&buf[nCurrentPos]);
nCurrentPos=nCurrentPos+len+1;
//validity_period
len=StrnCopy(psmpp_deliver->szValidity_period,21,&buf[nCurrentPos]);
nCurrentPos=nCurrentPos+len+1;
//registered_delivery_flag
psmpp_deliver->cRegistered_deliver_flag=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//replace_if_present_flag
psmpp_deliver->cReplace_if_present_flag=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//data_coding
psmpp_deliver->cData_coding=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//sm_default_msg_id
psmpp_deliver->csm_Default_msg_id=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//sm_length
psmpp_deliver->csm_Length=(unsigned char)buf[nCurrentPos];
nCurrentPos+=1;
//short_message,可能是二进制数据
memcpy(psmpp_deliver->szShort_message,&buf[nCurrentPos],psmpp_deliver->csm_Length);
// return ;
}break;
}
}
//拷贝最大化的字符串
int CSMCSocket::StrnCopy(char* szbuf,int nMaxstrlen,char* szSource)
{
int nStrlen=strlen(szSource);
nStrlen=(nStrlen>nMaxstrlen)?nMaxstrlen:nStrlen;
strncpy(szbuf,szSource,nStrlen);
return nStrlen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -