📄 mtsocket.cpp
字号:
// MtSocket.cpp : implementation file
//
#include "stdafx.h"
#include "MtSocket.h"
#include "md5.h"
#include "VariantBufConvert.h"
#include "MtThread.h"
#include <string.h>
#include <stdio.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMtSocket
CMtSocket::CMtSocket()
{
m_SequenceID=0;
m_SubmitMsgID=0;
m_pParentThread=NULL;
m_MsgIdSequence=10000;
m_NodeID=0;
m_SqnID=0;
}
CMtSocket::~CMtSocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CMtSocket, CSocket)
//{{AFX_MSG_MAP(CMtSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0
/////////////////////////////////////////////////////////////////////////////
// CMtSocket member functions
//创建Socket套接字
BOOL CMtSocket::CreateSocket(UINT LocalPort)
{
m_CurLen=0;
m_Result=0;
if(!Create(LocalPort))
return FALSE;
else
return TRUE;
}
////小于10的字符串补0
CString CMtSocket::ProduceTwoNum(int Num)
{
CString TempString;
if(Num<10)
TempString.Format("0%d",Num);
else
TempString.Format("%d",Num);
return TempString;
}
//产生时间戳
int CMtSocket::ProduceTimeStamp()
{
CTime CurTime=CTime::GetCurrentTime();
CString FmtTime;
FmtTime=CurTime.Format("%m%d%H%M%S");
int TimeValue=atoi(FmtTime);
return TimeValue;
}
//接收消息
void CMtSocket::OnReceive(int nErrorCode)
{
unsigned char* pBuffer=Buffer;
if(2000-m_CurLen<=0)
{
CSocket::OnReceive(nErrorCode);
return;
}
unsigned int RecSize=Receive(pBuffer+m_CurLen,2000-m_CurLen);
unsigned int MsgLength;
unsigned int CommandID;
char Result=-1; //接受到Deliver是否正确
CString MobileNum,RecContent,DestNum;
BOOL AllHasBeenProcess=TRUE;
RecSize=RecSize+m_CurLen; //包的总长为两次分包的总长
//BYTE Result;
while(AllHasBeenProcess) //消息可能会联包,所以依据长度和CommandID分别取完
{
if(RecSize<20) //收到的包大小小于包头,错误
{
char TempBuf[21];
memcpy(TempBuf,pBuffer,RecSize); //保存不正常的分包,等下一次包的到来
memcpy(Buffer,TempBuf,RecSize);
m_CurLen=RecSize;
break;
}
memcpy(&MsgLength,pBuffer,4);
MsgLength=ntohl(MsgLength);
if(MsgLength<=0)
{
m_CurLen=0;
CSocket::OnReceive(nErrorCode);
m_pParentThread->OnReceiveWrongMsg("Wrong Len");
return;
}
else if(MsgLength>RecSize)//说明分包了
{
char TempBuf[500];
memcpy(TempBuf,pBuffer,RecSize); //保存不正常的分包,等下一次包的到来
memcpy(Buffer,TempBuf,RecSize);
m_CurLen=RecSize;
AllHasBeenProcess=FALSE;
break;
}
else if(MsgLength==RecSize)//说明取完了
{
AllHasBeenProcess=FALSE;
memcpy(&CommandID,pBuffer+4,4);
CommandID=ntohl(CommandID);
}
else if(MsgLength<RecSize)//说明是联包,但要分析完
{
memcpy(&CommandID,pBuffer+4,4);
CommandID=ntohl(CommandID);
}
switch(CommandID)
{
case SGIP_BIND_RESP: //收到BindResponse
{
SGIP_BindResp* pRsp=(SGIP_BindResp*)pBuffer;
if(!m_pParentThread->OnSubmitStatus(1,pRsp->Result ,NULL))
{
return;
}
break;
}
case SGIP_SUBMIT_RESP: //收到SUBMITResp
{
SGIP_SubmitResp* pRsp=(SGIP_SubmitResp*)pBuffer;
if(!m_pParentThread->OnSubmitStatus(2,pRsp->Result,(char*)pRsp->m_SGIPHead.Sequence_Number))
{
return;
}
break;
}
case SGIP_UNBIND_RESP:
{
SGIP_UnBindResp* pRsp=(SGIP_UnBindResp*)pBuffer;
if(!m_pParentThread->OnSubmitStatus(3,NULL,(char*)pRsp->m_SGIPHead.Sequence_Number))
{
return;
}
break;
}
default:
{
char csCommandId[20];
itoa(CommandID,csCommandId,16);
CSocket::OnReceive(nErrorCode);
//m_pParentThread->OnReceiveWrongMsg(csCommandId);
m_pParentThread->OnReceiveWrongMsg("Receive MT message");
return;
}
}
RecSize=RecSize-MsgLength;
if(RecSize<=0)
{
m_CurLen=0;
break;
}
pBuffer=pBuffer+MsgLength; //取下一条消息
}//while
CSocket::OnReceive(nErrorCode);
}
//向ISMG发送消息
BOOL CMtSocket::SendToIsmg(void *Buffer, int BufferLen)
{
if(!Send(Buffer,BufferLen))
return FALSE;
else
return TRUE;
}
//发送Submit包
//发送断开包
void CMtSocket::SendTerminate()
{
SGIP_UnBind UnBindPackage;
UnBindPackage.m_SGIPHead.Command_ID=htonl(SGIP_UNBIND) ;
UnBindPackage.m_SGIPHead.Message_Length=htonl(20) ;
ProduceSequenceNum(UnBindPackage.m_SGIPHead.Sequence_Number);
SendToIsmg(&UnBindPackage,sizeof(UnBindPackage));
}
//Bind连接
BOOL CMtSocket::Bind(CString &RemoteIP, UINT &RemotePort, CString& SPID,CString& SourceNode,CString &UserName, CString &Password)
{
if(!Connect(RemoteIP,RemotePort))//连接失败
{
return FALSE;
}
//先生成源节点编号
CString csSourceID;
csSourceID=SourceNode+SPID;
unsigned long uSourceID=unsigned long (atol(csSourceID));
m_NodeID=htonl(uSourceID);//11
memset(&m_Bind,0,sizeof(m_Bind));
//产生SequenceNumber
ProduceSequenceNum(m_Bind.m_SGIPHead.Sequence_Number);
m_Bind.m_SGIPHead.Command_ID=htonl(SGIP_BIND);
m_Bind.m_SGIPHead.Message_Length=htonl(61); //61个子节长
memcpy(m_Bind.LoginName, UserName.GetBuffer(UserName.GetLength()),UserName.GetLength());
memcpy(m_Bind.LoginPassword, Password.GetBuffer(Password.GetLength()),Password.GetLength());
m_Bind.LoginType=1;
return SendToIsmg(&m_Bind,61);
}
//断开连接
BOOL CMtSocket::UnBind()
{
memset(&m_UnBind,0,sizeof(m_UnBind));
m_UnBind.m_SGIPHead.Command_ID =htonl(SGIP_UNBIND);
m_UnBind.m_SGIPHead.Message_Length =htonl(20);
ProduceSequenceNum(m_UnBind.m_SGIPHead.Sequence_Number);
return SendToIsmg(&m_UnBind,sizeof(m_UnBind));
}
//产生SequenceID
void CMtSocket::ProduceSequenceNum(unsigned char *SqN)
{
int TimeValue=htonl(ProduceTimeStamp());
int Sqn=htonl(m_pParentThread->GetSequenceID());
memcpy(SqN,&m_NodeID,4);
memcpy(SqN+4,&TimeValue,4);
memcpy(SqN+8,&Sqn,4);
}
//Submit下发短消息
BOOL CMtSocket::SgipSubmit(CString SrcTerminateID, CString DestTerminateID, CString FeeTerminateID, CString FeeType, CString FeeCode, CString Content, CString ServiceID, CString SPID, int &MsgFmt,CString LinkID,CString MotoMtFlag,CString RegistDeliver)
{
if (LinkID=="no")LinkID="";
int SendLen=156+Content.GetLength()+8;
SGIP_Submit SgipSubmit;
memset(&SgipSubmit,0,sizeof(SgipSubmit));
SgipSubmit.m_SGIPHead.Message_Length=htonl(SendLen);
SgipSubmit.m_SGIPHead.Command_ID=htonl(SGIP_SUBMIT);
ProduceSequenceNum(SgipSubmit.m_SGIPHead.Sequence_Number);
//得到特服号
memcpy(SgipSubmit.SPNumber,SrcTerminateID.GetBuffer(SrcTerminateID.GetLength()),SrcTerminateID.GetLength());
CString TmpStr="000000000000000000000";
//付费手机,前加86
if (ServiceID!="ERROR"){
SgipSubmit.ChargeNumber[0]='8';
SgipSubmit.ChargeNumber[1]='6';
memcpy(&(SgipSubmit.ChargeNumber[2]),FeeTerminateID.GetBuffer(FeeTerminateID.GetLength()),FeeTerminateID.GetLength());
}
else{
memcpy(&(SgipSubmit.ChargeNumber[0]),TmpStr.GetBuffer(TmpStr.GetLength()),21);
}
//接受短信用户数
SgipSubmit.UserCount=1;
SgipSubmit.UserNumber[0]='8';
SgipSubmit.UserNumber[1]='6';
memcpy(&(SgipSubmit.UserNumber[2]),DestTerminateID.GetBuffer(DestTerminateID.GetLength()),DestTerminateID.GetLength());
//企业代码
memcpy(SgipSubmit.CorpId, SPID.GetBuffer(SPID.GetLength()),SPID.GetLength());
memcpy(SgipSubmit.ServiceType,ServiceID.GetBuffer(ServiceID.GetLength()),ServiceID.GetLength());
int iFeetype=atoi(FeeType);
SgipSubmit.FeeType=(char)iFeetype;
memcpy(SgipSubmit.FeeValue,FeeCode.GetBuffer(FeeCode.GetLength()),FeeCode.GetLength());
//无GivenValue
//AgentFlag=0
//Priority=0
//ExpireTime
//ScheduleTime
SgipSubmit.ReportFlag=atoi(RegistDeliver);
SgipSubmit.MorelatetoMTFlag=atoi(MotoMtFlag);
//Tp_pid
//TP_udhi
SgipSubmit.MessageCoding=(char)MsgFmt;
//MessageType=0
SgipSubmit.MessageLength=htonl(Content.GetLength());
char* pBuf=m_SendBuf;
memcpy(pBuf,&SgipSubmit,156);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -