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

📄 dnmakersppack.cpp

📁 SMS gateway. SMS protocol for CHINA mobile, unicom, lingtong. Using mysql to exchange message.
💻 CPP
字号:
/**********************************************************************
  FileName            : DnMakeRspPack.cpp
  Description         : 下端应答包构造模块
  Version             : 1.0
  Date                : 2003年9月15日
  Author              : 刘荣辉
  Other               : 
***********************************************************************/

#include "DnNode.h"
//#include "GateWay.h"

int  CDnNode::MakeRspPack(void *ReqPack, void **RspPack)
//int  CGateWay::MakeRspPack(void *ReqPack, void **RspPack)
{
  unsigned int PackType;
  int Status;
  int Result;
  //char timebuf[16];
  
  Status = 0;	//作为参数值返回,据此来判断是否重连,不重连时其值与Result相同
  Result = 0;	//需要返回的应答包的状态码
  PackType = ntohl(*(unsigned int *)((char *)ReqPack+4));
  switch(PackType)
  {
   case CMPP_CONNECT:
   {
   	CMPP_Connect * tReqPack = (CMPP_Connect *)ReqPack;
   	//数据包(Deliver)合法性检查
  	if(ntohl(tReqPack->Head.Total_Length) > sizeof(CMPP_Connect))
  	{
  		Result=6;	//超过最大信息长
  		Status=999;	//需要重新建立连接
  		break;
  	}
  	//MD5认证码的检查???????????????????????????
  	else if(0)
  	{
  		
  	}
  	//形成应答包(CMPP_Connect_Resp)
  	CMPP_Connect_Resp * tRspPack = (CMPP_Connect_Resp *)malloc(sizeof(CMPP_Connect_Resp));
  	tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Connect_Resp));
  	tRspPack->Head.Command_Id = htonl(CMPP_CONNECT_RESP);
  	tRspPack->Head.Sequence_Id = tReqPack->Head.Sequence_Id;
  	tRspPack->Status = Result; 
	//形成ISMG认证码??????????????????????????????
	//memcpy(tRspPack->AuthenticatorISMG,);
  	tRspPack->Version = CMPPVersion; 
  	*RspPack = (void *)tRspPack;
  	break;
   }
   //------------------------------------------------   
   case CMPP_SUBMIT:  
   {
  	CMPP_Submit * tReqPack = (CMPP_Submit *)ReqPack;
   	//数据包合法性检查
  	if(ntohl(tReqPack->Head.Total_Length) > sizeof(CMPP_Submit))
  	{
  		Result=6;	//超过最大信息长
  		Status=999;	//需要重新建立连接
  		break;
  	}
  	else if(strcmp(tReqPack->Service_Id,ServiceID)!=0 && strcmp(tReqPack->Service_Id,MFXX)!=0)
  	{
  		Result=7;	//业务代码错
		Status=Result;
  		break;
  	}
  	else if(strncmp(tReqPack->Src_Id,ServiceCode,CPCODE_LEN)!=0)
  	{
  		Result=9;	//源号码错,没有以ServiceCode开头
		Status=Result;
  		break;
  	}
  	else if(tReqPack->DestUsr_tl != 1)
  	{
  		Result=1;	//消息结构错,不支持群发包
		Status=Result;
  		break;
  	}
  	//其他字段的检查?????????????????????????????
  	else if(0)
  	{
  		
  	}
	//printf("\n DN MsgLen=[%d].\n",tReqPack->Msg_Length);
	tReqPack->Msg_Length = ntohl(tReqPack->Head.Total_Length) + sizeof(tReqPack->Msg_Content) - sizeof(CMPP_Submit);
	//printf("\n DN MsgLen=[%d].\n",tReqPack->Msg_Length);
	//形成应答包(CMPP_Connect_Resp)
  	CMPP_Submit_Resp * tRspPack = (CMPP_Submit_Resp *)malloc(sizeof(CMPP_Submit_Resp));
  	tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Submit_Resp));
  	tRspPack->Head.Command_Id = htonl(CMPP_SUBMIT_RESP);
  	tRspPack->Head.Sequence_Id = tReqPack->Head.Sequence_Id;
	tRspPack->Msg_Id = 0;	//Msg_Id在DnReceiver中分配,所有下节点共用
  	tRspPack->Result = Result; 
  	*RspPack = (void *)tRspPack;
  	break;
   }
   //------------------------------------------------
   case CMPP_ACTIVE_TEST:
   {
  	CMPP_Active_Test * tReqPack = (CMPP_Active_Test *)ReqPack;
  	//数据包(Deliver)合法性检查
  	if(ntohl(tReqPack->Total_Length) != sizeof(CMPP_Active_Test))
  	{
  		Result=4;	//消息长度错
  		Status=999;	//需要重新建立连接
  		break;
  	}
  	//形成应答包(Deliver_Rsp)
  	CMPP_Active_Test_Resp * tRspPack = (CMPP_Active_Test_Resp *)malloc(sizeof(CMPP_Active_Test_Resp));
  	tRspPack->Head.Total_Length = htonl(sizeof(CMPP_Active_Test_Resp));
  	tRspPack->Head.Command_Id = htonl(CMPP_ACTIVE_TEST_RESP);
  	tRspPack->Head.Sequence_Id = tReqPack->Sequence_Id;  	
  	*RspPack = (void *)tRspPack;
	free(ReqPack);	//释放请求包所占内存,Active_Test包至此处理完毕
  	Status = 1;	//Active_Test包至此处理完毕,不再放进接收队列中
	break;
   }
   //------------------------------------------------
   case CMPP_TERMINATE:  //能否马上返回应答包?????
   {  	
  	//*RspPack = (void *)tRspPack;
	//printf("\n MakeCMPPRsp: Got a CMPP_TERMINATE! Connection is to be lost!\n");
  	Status=1000;	//需要重新建立连接
	*RspPack = NULL;
  	break;
   }
   case CMPP_QUERY:  //能否马上返回应答包?????
   {	
  	
  	//*RspPack = (void *)tRspPack;
	*RspPack = NULL;
  	break;
   }	
   case CMPP_CANCEL:  //能否马上返回应答包?????
   {	
  	
  	//*RspPack = (void *)tRspPack;
	*RspPack = NULL;
  	break;
   }	
   default :
   {
   	Result=11;	//命令字错
  	Status=999;	//需要重新建立连接
  	
  	//*RspPack = (void *)tRspPack;
	*RspPack = NULL;
  	break;
   }
  }//switch()
 
  return Status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -