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

📄 smg_pack.cpp

📁 在unix环境下
💻 CPP
字号:
/********************************************************** * name: smg_pack.cpp * * Description:  *   TBS MUSE smg_pack.cpp * *   Copyright to DDP 2000-2001 All rights reverved. *   2001.11.02 Created * * email: ddp@public.qz.fj.cn **********************************************************/ #include "../include/smg.h" #include "../include/unicode.h"/************************************************************************* * *	Function: pack_submit * *	Purpose:  change deliver to submit format and send to SMPP_PROXY. * *	Return:   void. *  *************************************************************************/int pack_submit( LISTSMG *p ,int type_flag){	LISTSMG *p1;	unsigned char *ptr,*ptr1;	char user[22];	char cMsgId[9];	unsigned char iCodeType;	int recode;	int lSMSC_sequence;	thread.Pthread_mutex_lock( &mutex_free );	while ( queue.CheckQueue(QUEUE_FREE) != 0 )	{		thread.Pthread_cond_wait( &cond_free,&mutex_free );	}	p1 = queue.GetNode(QUEUE_FREE);	n_free_node --;	thread.Pthread_mutex_unlock( &mutex_free );	if(p1 == NULL)	{		return 0;	}	memset( p1 , 0 , sizeof(LISTSMG) );		/* 一定要初始化 */	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr1 = (unsigned char *) p1->data.cPacketBuffer;	memcpy(ptr1 , cfg.local_id , 6); // Source_Id.	ptr1 = ptr1 + 6;	memcpy(ptr1 , cfg.dest_id , 6); // Dest_Id.	ptr1 = ptr1 + 6;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // NodesCount.	ptr1 =  ptr1 + 1;		iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fwd_Type. <0=MT 2=REPORT>	ptr1 =  ptr1 + 1;	strcpy(cMsgId,"11113333");	lSMSC_sequence = get_msgidseq();	sprintf(p1->msgid,"%08d%08s%04x",get_time(),cMsgId,lSMSC_sequence);	p1->msgid[20]='\0';	CvtStr2Msgid(p1->msgid, cMsgId);	memcpy(ptr1, cMsgId, 8 );  // Msg_id	ptr1 = ptr1 + 8;   	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_total.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_number.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Registered_Delivery.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_level.	ptr1 =  ptr1 + 1;	memset(user,0,USERLENGTH);	memcpy(ptr1 , user , 10);   // Service_id.	ptr1 = ptr1 + 10;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Fee_userType.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,21);   // Fee_terminal_id.	ptr1 = ptr1 + 21;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_pid.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_udhi.	ptr1 =  ptr1 + 1;	iCodeType = (char) 15;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fmt. 15=GBK.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,6);  // Msg_Src.	ptr1 = ptr1 + 6;  	strcpy(cMsgId,"02");	memcpy(ptr1,cMsgId,2);  // FeeType.	ptr1 = ptr1 + 2;	memcpy(ptr1,user,6);   // FeeCode.	ptr1 = ptr1 + 6;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21 - 1 -21 - 34;	memcpy(ptr1 , ptr , 34 );  // Valid_Time,At_Time.	ptr1 = ptr1 + 34;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21;	memcpy(ptr1 , ptr , 21 );  // srcuser.	ptr1 = ptr1 + 21;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // destnum.	ptr1 =  ptr1 + 1;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21 - 1 -21;	memcpy(ptr1 , ptr , 21 );  // destuser.	ptr1 = ptr1 + 21;	if ( type_flag == 1)	{		recode = strlen(cfg.prompt_info1)+1;		iCodeType = (unsigned char)recode; 		memcpy(ptr1 ,&iCodeType , 1 ); // Msg_length.		ptr1 =  ptr1 + 1;		memcpy(ptr1, cfg.prompt_info1 , recode );	}	else if ( type_flag == 2 )	{		recode = strlen(cfg.prompt_info2)+1;		iCodeType = (unsigned char)recode; 		memcpy(ptr1 ,&iCodeType , 1 ); // Msg_length.		ptr1 =  ptr1 + 1;		memcpy(ptr1, cfg.prompt_info2 , recode );	}	else	{		char ctmp1[41];		strcpy(ctmp1,"系统忙,请重试");		recode = strlen(ctmp1)+1;		iCodeType = (unsigned char)recode; 		memcpy(ptr1 ,&iCodeType , 1 ); // Msg_length.		ptr1 =  ptr1 + 1;		memcpy(ptr1, ctmp1 , recode );	}	ptr1 = ptr1 + recode;	memcpy(ptr1, user, 8); // Reserve.	p1->mlen = recode;	p1->packettype  = 2;	p1->ctype = 0;	p1->count = 0;	p1->request = 0;	p1->priority = 0;	p1->ackflag = 0;	p1->msgcode = 15;	p1->recvtime = time(NULL);	p1->status  = QUEUE_DEAL;	p1->seq     = get_smscseq();	p1->ackflag   = 0;	recode = SMGHEADLENGTH + FORWARDLENGTH + 1 + recode + 8;	p1->data.lPacketLength = htonl(recode);	p1->data.lRequestId    = htonl(SMGP_FORWARD);	p1->data.lSequenceId   = htonl(p1->seq);	NodeEnterQueue(p1,0);	return 0;}/************************************************************************* * *	Function: pack_report * *	Purpose:  change deliver to report format and send to SMPP_PROXY. * *	Return:   void. *  *************************************************************************/int pack_report( LISTSMG *p ,int type_flag,char *in_stat){	LISTSMG *p1;	char user[USERLENGTH+1],cMsgId[9];	unsigned char *ptr,*ptr1,iCodeType;	int lSMSC_sequence,recode;	time_t curr_time;	struct tm buffer,*ptm;	char datetime_str[15];	curr_time = time( NULL );	ptm = (struct tm *)localtime_r( &curr_time,&buffer );	sprintf( datetime_str,"%02d.%02d:%02d:%02d",ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);	thread.Pthread_mutex_lock( &mutex_free );	while ( queue.CheckQueue(QUEUE_FREE) != 0 )	{		thread.Pthread_cond_wait( &cond_free,&mutex_free );	}	p1 = queue.GetNode(QUEUE_FREE);	n_free_node --;	thread.Pthread_mutex_unlock( &mutex_free );	if(p1 == NULL)	{		return 0;	}	memset( p1 , 0 , sizeof(LISTSMG) );		/* 一定要初始化 */	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr1 = (unsigned char *) p1->data.cPacketBuffer;	memcpy(ptr1 , cfg.local_id , 6); // Source_Id.	ptr1 = ptr1 + 6;	//memcpy(ptr1 , cfg.dest_id , 6); // Dest_Id.	ptr1 = ptr1 + 6;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // NodesCount.	ptr1 =  ptr1 + 1;		iCodeType = (char) 2;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fwd_Type. <0=MT 2=REPORT>	ptr1 =  ptr1 + 1;	strcpy(user,smsc[0].cSmscCode);	memcpy(cMsgId,user+3,8);	cMsgId[8] = '\0';	lSMSC_sequence = get_msgidseq();	sprintf(p1->msgid,"%08d%08s%04x",get_time(),cMsgId,lSMSC_sequence);	p1->msgid[20]='\0';	CvtStr2Msgid(p1->msgid, cMsgId);	memcpy(ptr1, cMsgId, 8 );  // Msg_id	ptr1 = ptr1 + 8;   	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_total.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_number.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Registered_Delivery.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_level.	ptr1 =  ptr1 + 1;	memset(user,0,USERLENGTH);	memcpy(ptr1 , user , 10);   // Service_id.	ptr1 = ptr1 + 10;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Fee_userType.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,21);   // Fee_terminal_id.	ptr1 = ptr1 + 21;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_pid.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_udhi.	ptr1 =  ptr1 + 1;	iCodeType = (char) 15;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fmt. 15=GBK.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,6);  // Msg_Src.	ptr1 = ptr1 + 6;  	strcpy(cMsgId,"02");	memcpy(ptr1,cMsgId,2);  // FeeType.	ptr1 = ptr1 + 2;	memcpy(ptr1,user,6);   // FeeCode.	ptr1 = ptr1 + 6;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21 - 1 -21 - 34;	memcpy(ptr1 , ptr , 34 );  // Valid_Time,At_Time.	ptr1 =  ptr1 + 34;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21;	memcpy(ptr1 , ptr , 21 );  // Src_terminal_id.	ptr1 = ptr1 + 21;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // DestUsr_tl.	ptr1 =  ptr1 + 1;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21 - 1 - 21;	memcpy(ptr1 , ptr , 21 );  // Dest_terminal_id.	/*songyp 0216 判断是否为国际互通*/	ptr1[21] = '\0';	if (strncmp((char *)ptr1,"00",2)==0)	{		p1->status  = QUEUE_SPLIT;		memcpy(p1->data.cPacketBuffer+6,cfg.dest_id1,6);	}	else	{		p1->status = QUEUE_REMOTE;		memcpy(p1->data.cPacketBuffer+6,cfg.dest_id,6);	}	/*songyp 0216 end*/	ptr1 = ptr1 + 21;	iCodeType = (char) 60;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_length.	ptr1 =  ptr1 + 1;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + 14;	memcpy(ptr1 , ptr , 8); // Msg_id.	ptr1 = ptr1 + 8;	memcpy(ptr1,in_stat,7); // Stat.	ptr1 = ptr1 + 7;	sprintf(datetime_str,"%04d%02d%02d%02d%02d",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min);	memcpy(ptr1,datetime_str+2,10);  // Submit_time.	ptr1 = ptr1 + 10;	memcpy(ptr1,datetime_str+2,10);  // Done_time.	ptr1 = ptr1 + 10;	ptr  = (unsigned char *) p->data.cPacketBuffer;	ptr = ptr + FORWARDLENGTH - 21;	memcpy(ptr1 , ptr , 21); // Dest_terminal_id.	ptr1 = ptr1 + 21;	lSMSC_sequence = htonl(lSMSC_sequence);	memcpy(ptr1 , &lSMSC_sequence , 4 );	ptr1 = ptr1 + 4;	memcpy(ptr1 , user, 8); // Reserve.	p1->mlen = 60;	p1->packettype  = 2;	p1->ctype = 2;	p1->count = 0;	p1->request = 0;	p1->priority = 0;	p1->ackflag = 0;	p1->msgcode = 15;	p1->recvtime = time(NULL);	p1->seq     = get_packetseq();	p->seq = p1->seq;	p1->ackflag   = 0;	strcpy(p1->msgid,p->msgid);	recode = SMGHEADLENGTH + FORWARDLENGTH + 1 + 60 + 8;	p1->data.lPacketLength = htonl(recode);	p1->data.lRequestId    = htonl(SMGP_FORWARD);	p1->data.lSequenceId   = htonl(p1->seq);	NodeEnterQueue(p1,0);	return 0;}/************************************************************************* * *	Function: pack_forward * *	Purpose:  change deliver to submit format and send to SMPP_PROXY. * *	Return:   void. *  *************************************************************************/int pack_forward( int type_flag , char *recv_number ){	LISTSMG *p1;	unsigned char *ptr1,iCodeType;	char str_info[256],str_unicode[256],user[22];	char cMsgId[9];	int lSMSC_sequence,recode;	thread.Pthread_mutex_lock( &mutex_free );	while ( queue.CheckQueue(QUEUE_FREE) != 0 )	{		thread.Pthread_cond_wait( &cond_free,&mutex_free );	}	p1 = queue.GetNode(QUEUE_FREE);	n_free_node --;	thread.Pthread_mutex_unlock( &mutex_free );	if(p1 == NULL)	{		return 0;	}	ptr1 = (unsigned char *) p1->data.cPacketBuffer;	memcpy(ptr1 , cfg.local_id , 6); // Source_Id.	ptr1 = ptr1 + 6;	memcpy(ptr1 , cfg.dest_id , 6); // Dest_Id.	ptr1 = ptr1 + 6;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // NodesCount.	ptr1 =  ptr1 + 1;		iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fwd_Type. <0=MT 2=REPORT>	ptr1 =  ptr1 + 1;	strcpy(cMsgId,"11112222");	lSMSC_sequence = get_msgidseq();	sprintf(p1->msgid,"%08d%08s%04x",get_time(),cMsgId,lSMSC_sequence);	p1->msgid[20]='\0';	CvtStr2Msgid(p1->msgid, cMsgId);	memcpy(ptr1, cMsgId, 8 );  // Msg_id	ptr1 = ptr1 + 8;   	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_total.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Pk_number.	ptr1 =  ptr1 + 1;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Registered_Delivery.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_level.	ptr1 =  ptr1 + 1;	memset(user,0,USERLENGTH);	memcpy(ptr1 , user , 10);   // Service_id.	ptr1 = ptr1 + 10;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // Fee_userType.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,21);   // Fee_terminal_id.	ptr1 = ptr1 + 21;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_pid.	ptr1 =  ptr1 + 1;	iCodeType = (char) 0;	memcpy(ptr1 ,&iCodeType , 1 ); // TP_udhi.	ptr1 =  ptr1 + 1;	iCodeType = (char) 8;	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_Fmt. 15=GBK.	ptr1 =  ptr1 + 1;	memcpy(ptr1,user,6);  // Msg_Src.	ptr1 = ptr1 + 6;  	strcpy(cMsgId,"02");	memcpy(ptr1,cMsgId,2);  // FeeType.	ptr1 = ptr1 + 2;	memcpy(ptr1,user,6);   // FeeCode.	ptr1 = ptr1 + 6;	memcpy(ptr1, user, 17 ); // Valid_Time.	ptr1 = ptr1 + 17;	memcpy(ptr1, user, 17 ); // At_Time.	ptr1 = ptr1 + 17;	memcpy(ptr1, recv_number , 21 ); // srcuser.	ptr1 = ptr1 + 21;	iCodeType = (char) 1;	memcpy(ptr1 ,&iCodeType , 1 ); // destnum.	ptr1 =  ptr1 + 1;	memcpy(ptr1, recv_number , 21 ); // destuser.	ptr1 = ptr1 + 21;	sprintf(str_info,"警告:%s与对方网关断开%d秒!",cfg.local_id,(type_flag/cfg.n_remote_threads)*2);	recode = strlen(str_info)+1;	Convert_GB2312_to_GB13000( (unsigned char *)str_info, (unsigned char *)str_unicode , &recode);	iCodeType = (unsigned char)recode; 	memcpy(ptr1 ,&iCodeType , 1 ); // Msg_length.	ptr1 =  ptr1 + 1;	memcpy(ptr1, str_unicode , recode );	ptr1 = ptr1 + recode;	memcpy(ptr1, user, 8); // Reserve.	p1->mlen = recode;	p1->packettype  = 2;	p1->ctype = 0;	p1->count = 0;	p1->request = 0;	p1->priority = 0;	p1->ackflag = 0;	p1->msgcode = 15;	p1->recvtime = time(NULL);	p1->status  = QUEUE_DEAL;	p1->seq     = get_smscseq();	p1->ackflag   = 0;	recode = SMGHEADLENGTH + FORWARDLENGTH + 1 + recode + 8;	p1->data.lPacketLength = htonl(recode);	p1->data.lRequestId    = htonl(SMGP_FORWARD);	p1->data.lSequenceId   = htonl(p1->seq);	NodeEnterQueue(p1,0);	return 0;}/******************************************************************/

⌨️ 快捷键说明

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