📄 smg_pack.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 + -