⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtsocket.cpp

📁 一个手机通信的源代码 一个手机通信的源代码一个手机通信的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -