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

📄 smcsocket.cpp

📁 模拟手机源程序,做短信系统(源码)
💻 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 + -