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

📄 sendun.cpp

📁 SP平台联通短信发送程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      {
         ffbuf[x++]=ffstr[pos];//将不是的放到ffbuf里面
			   pos++;
      }
    }
    puts(ffbuf);
    strcpy(com_buf->sMsgContent,ffbuf);
    
    /*当内容中含有非法字符时进行处理   end*/
                
		sprintf(sql,
		        "UPDATE COM_SEND        SET FLAG='90'        WHERE ID=%s",       com_buf->id);
		if(DoSQL(sql,&myconn) != 0)
		{
			free(com_buf);
			writelog(SELF_TYPE,"更新数据库出错!");
			mysql_free_result(res);
			return 0;
		}
		
		//群发不用判断号段
		if (com_buf->nMsgFormat == 99)
		{
			addwaitlist(com_buf);
			continue;
		}
		
		//*******************************************************************************************
		//根据号段判断  接收  手机号是哪个省的
		//sprintf(sql,
		//       "SELECT PROVINCE FROM INFO_HD 
		//       WHERE INFO_HD.HD=SUBSTRING('%s',1,7)",com_buf->sDesTermID);
		//retval = QuerySQL(sql,&myconn,&res2);
		//if(retval != 0)
		//{
		//	writelog(SELF_TYPE,"查询指令出错INFO_HD");
		//	mysql_free_result(res);
		//	return 0;
		//}
		//if(res == NULL)
		//{
		//	mysql_free_result(res);	
		//	return 0;
		//}
		//
		//if (row = mysql_fetch_row(res2))
		//{
		//	flag1=1;			//是本省
		//}	
		//else
		//{
		//	flag1=0;			//不能确定
		//}
		//
		//mysql_free_result(res2);		
                //
		////被叫付费
		//if (com_buf->cFeeUserType==0)
		//{
		//	if (flag1==0)		//不能确定,则插入COM_SEND_OTHER表中,DEMO=PROVINCE,并发送出去
		//	{
		//		Send_Demo(sendstruc,PROVINCE); 
		//	}
		//}
		////第三方付费
		//else
		//{
		//	//根据号段判断 付费 手机号是哪个省的
		//	sprintf(sql,
		//	       "SELECT PROVINCE FROM INFO_HD 
		//	       WHERE INFO_HD.HD=SUBSTRING('%s',1,7) ",com_buf->sFeeTerminalID);
		//	retval = QuerySQL(sql,&myconn,&res2);
		//	if(retval != 0)
		//	{
		//		writelog(SELF_TYPE,"查询指令出错INFO_HD3");
		//		mysql_free_result(res);	
		//		return 0;
		//	}
		//	if(res == NULL)
		//	{
		//		mysql_free_result(res);	
		//		return 0;
		//	}
		//	
		//	if (row = mysql_fetch_row(res2))
		//	{
		//		flag2=1;			//是本省
		//	}	
		//	else
		//	{
		//		flag2=0;			//不是本省
		//	}
		//	
		//	mysql_free_result(res2);   
                //
		//	//若接收手机号是本省的,付费手机号是本省的
		//	if (flag1==1 && flag2==1) 
		//	{
		//		//按正常的第三方付费方式下发一条,直接正常发送
		//	}
		//	//******************    flag1=0    ************************	
                //	
		//	//若接收手机号和付费手机号都是不能确定的
		//	else if (flag1==0 && flag2==0) 
		//	{
		//		//将不能确定省份的接收手机号插入到COM_SEND_OTHER表中,接收免费
		//		sendstruc.cFeeUserType = 0;
		//		strcpy(sendstruc.sFeeTerminalID,"");
		//		strcpy(sendstruc.sFeeType,"00");
		//		Send_Demo(sendstruc,PROVINCE);
		//		
		//		//将不能确定省份的付费手机号插入到COM_SEND_OTHER表中
		//		strcpy(sendstruc.sFeeType,com_buf->sFeeType);
		//		strcpy(sendstruc.sDesTermID,com_buf->sFeeTerminalID);					//付费手机号
		//		strcpy(sendstruc.sMsgContent,"信息已成功转发,感谢您使用我们的短信业务.");
		//		Send_Demo(sendstruc,PROVINCE);
		//		
		//		//按正常的第三方付费方式下发一条
		//	}
		//	//若接收手机号是不能确定的,付费手机号是本省的
		//	else if (flag1==0 && flag2==1) 
		//	{
		//		//将不能确定省份的接收手机号插入到COM_SEND_OTHER表中,接收免费
		//		sendstruc.cFeeUserType = 0;
		//		strcpy(sendstruc.sFeeTerminalID,"");
		//		strcpy(sendstruc.sFeeType,"00");
		//		Send_Demo(sendstruc,PROVINCE);
		//		
		//		//按正常的第三方付费方式下发一条
		//	}
		//
		//	//*******************************   flag1=1   **********************************	
		//	//若接收手机号是本省的,付费手机号是不能确定的
		//	else if (flag1==1 && flag2==0) 
		//	{
		//		//将不能确定省份的付费手机号插入到COM_SEND_OTHER表中
		//		sendstruc.cFeeUserType = 0;
		//		strcpy(sendstruc.sFeeTerminalID,"");
		//		strcpy(sendstruc.sDesTermID,com_buf->sFeeTerminalID);			//付费手机号
		//		strcpy(sendstruc.sMsgContent,"信息已成功转发,感谢您使用我们的短信业务.");
		//		Send_Demo(sendstruc,PROVINCE);
		//		
		//		//免费给接收手机下发一条
		//		com_buf->cFeeUserType = 0;
		//		strcpy(com_buf->sFeeTerminalID,"");
		//		strcpy(com_buf->sFeeType,"00");
		//	}
		//}
		
		//*******************************************************************************************
				
		if (com_buf->nMsgFormat == 24)				//判断是否是免提的
		{
			//gb转换成unicode	
			slen=gbtounicode(com_buf->sMsgContent,result);
			if (slen>140) slen=140;

			//更新com_buf->sMsgContent
			for (i=0;i<slen;i++)
			{
				com_buf->sMsgContent[i]=result[i];
			}

			//更新com_buf->nMsgLen
			com_buf->nMsgLen = slen;
			
		}
		else if (com_buf->nMsgFormat == 4 || com_buf->nMsgFormat == 245)	//铃声图片
		{
			//将三位十进制转换为一个字节的二进制
			slen=com_buf->nMsgLen;
			for (i=0;i<slen/3;i++)
			{
				strncpy(temp,com_buf->sMsgContent+3*i,3);
				j=atoi(temp);
				result[i]=j;
			}
			result[i]='\0';
	
			//更新com_buf->sMsgContent
			for (i=0;i<slen/3;i++)
			{
				com_buf->sMsgContent[i]=result[i];
			}

			//更新com_buf->nMsgLen
			com_buf->nMsgLen = slen/3;
			//联通铃声图片的CTPUDHI=1
			com_buf->cTpUdhi= 1;
		}

		addwaitlist(com_buf);
		
	}
	mysql_free_result(res);

	return retval1;
	
}

void send_sm()
{
	SENDSTRUC *sendstruc;
	int retval,socket,usercount,errcode,timecount,flag;
	char errmsg[40],msisdn[21],desttermid[30][21],tmpbuf[100];
	FILE *fp;
	
	//连接网关
	retval = connect_SMG(&socket);
	printf("connect smg retval:%d\n",retval);
	while (retval != 0)
	{	
		ISMG_DisConnect(&socket); 
		puts("连接短信网关失败!");
		writelog(SELF_TYPE,"连接短信网关失败!");
		retval = connect_SMG(&socket);
		printf("connect smg retval:%d\n",retval);
		sleep(1);
		continue;
	}
	puts("连接短信网关成功!");
	//计时断开
	timecount = 0;
	flag = 0;
	while(1)
	{
		if(getwaitlist(&sendstruc))
		{
			if (timecount==40)
			{
			 //已经断开重新连接,bind
			  retval = connect_SMG(&socket);
	     	printf("connect smg retval:%d\n",retval);
	     	while(retval != 0)
	     	{
			ISMG_DisConnect(&socket); 
		       puts("连接短信网关失败!");
		       writelog(SELF_TYPE,"连接短信网关失败!");
			retval = connect_SMG(&socket);
			printf("connect smg retval:%d\n",retval);
			sleep(1);continue;
	      }
	      puts("重新连接短信网关成功!");
	    }
	    timecount = 0;	
	    flag = 0;			
			//是群发,先要取出文件中对应的手机号,再群发
			strcpy(tmpbuf,sendstruc->sMsgID);
			if (sendstruc->nMsgFormat == 99)
			{
				puts("in sgipsendbatch");

				fp=fopen(sendstruc->sDesTermID,"r");
				if (fp==NULL)
				{
					writelog(SELF_TYPE,"文件打开错误");
					printf("文件打开错误");
					continue ;
				}
				
				usercount=0;
				
				while (fgets(msisdn,13,fp)!=NULL)
				{
					trim(msisdn,' ');
					chop(msisdn);
					if(strlen(msisdn) != 11) continue;
					msisdn[11] = '\0';
					//desttermid[usercount]=msisdn;
					usercount++;
				}
				
				fclose(fp);

				retval=SGIPSendBatch(sendstruc->nNeedReply,sendstruc->nMsgLevel,sendstruc->sServiceID,0,            
				      sendstruc->sFeeType,sendstruc->sFeeCode,sendstruc->sValidTime,sendstruc->sAtTime,       
				      sendstruc->sSrcTermID,desttermid,usercount,sendstruc->nMsgLen,sendstruc->sMsgContent,  
				      sendstruc->sMsgID,&errcode,sendstruc->cFeeUserType,sendstruc->sFeeTerminalID,sendstruc->cTpPid,sendstruc->cTpUdhi,&socket);   
				
				if (retval!=0)                                    
				{                                                 
					retval=SGIPSendBatch(sendstruc->nNeedReply,sendstruc->nMsgLevel,sendstruc->sServiceID,0,            
				      		sendstruc->sFeeType,sendstruc->sFeeCode,sendstruc->sValidTime,sendstruc->sAtTime,       
				      		sendstruc->sSrcTermID,desttermid,usercount,sendstruc->nMsgLen,sendstruc->sMsgContent,  
				      		sendstruc->sMsgID,&errcode,sendstruc->cFeeUserType,sendstruc->sFeeTerminalID,sendstruc->cTpPid,sendstruc->cTpUdhi,&socket);   
					
					sprintf(errmsg,"群发失败%s,%d",sendstruc->id,retval); 
					writelog(SELF_TYPE,errmsg); 
					printf("retval:%d\n",retval);              
				}                                                 
				
				sendstruc->flag = retval+1;
				
				addoklist(sendstruc);
				sleep(2);
			} 
			//单条发送      
			else    
			{       
				puts("send single");
				retval = SendSM(sendstruc,&socket);
				printf("sendsm retval:%d\n",retval);
				sendstruc->flag = retval;
				addoklist(sendstruc);
				usleep(10);
			}
		}
		//getwaitlist取不到信息,则等待1秒
		else
		{
			if (timecount<40)
			{
		      timecount = timecount + 1;
		  }
			else
			{
			//发送unbind断开连接
			  if (flag==0)
			  {	    
		       SendUnBind(socket,tmpbuf); 
		       ISMG_DisConnect(&socket); 
		       //连接断开
		       puts("连接断开!"); 
		       flag=1;
		    } 
			}
			sleep(1);
		}
	}
}

//单条发送
int SendSM(SENDSTRUC * sendstruc,int *socket)
{
	int retval,errcode;
	char errmsg[30];
	
	puts("sendstruc->sMsgID,");
	puts(sendstruc->sMsgID);
	puts(sendstruc->linkid);
	retval = SGIPSendSingle(0,//sendstruc->nNeedReply,
						  sendstruc->nMsgLevel,
							sendstruc->sServiceID,
							sendstruc->nMsgFormat,
							sendstruc->sFeeType,
							sendstruc->sFeeCode,
							sendstruc->sValidTime,
							sendstruc->sAtTime,
							sendstruc->sSrcTermID,
							sendstruc->sDesTermID,
							sendstruc->nMsgLen,
							sendstruc->sMsgContent,
							sendstruc->sMsgID,
							&errcode,
							sendstruc->cFeeUserType,
							sendstruc->sFeeTerminalID,
							sendstruc->cTpPid,
							sendstruc->cTpUdhi,
							sendstruc->linkid,
							socket);
	if(retval != 0)
	{
		sprintf(errmsg,"发送单条短消息失败!%d\n",retval);
		writelog(SELF_TYPE,errmsg);
		return errcode;
	}
	else
	{
		return 1;
	}

	return 1;
}


//将MSG中所有字符转化为UNICODE
//GB查表得到UNICODE,ASCII码在其前面加00。
//并求出所得字符串的实际长度,作为返回值。

int gbtounicode(char *msg,char *result)
{
	int i,j;
	unsigned int gb1,gb2,asc1,gb;
	char buf[3];
	
	i=0;
	j=0;
	
	while (i<strlen(msg))
	{
		buf[0]=msg[i];
		gb1 = (unsigned int)buf[0];
		gb2= gb1 & 0x80;

		if (gb2==0) 		//是ASCII
		{
			asc1 = (unsigned int) buf[0];
			asc1 &= 0xff;
			
			sprintf(buf,"%02X%02X",0,asc1);	
			puts(buf);
			sscanf(buf,"%x",&gb);
			
			buf[1] = gb & 0xff;
			buf[0] = gb >> 8;
			buf[2]='\0';		
					
			result[j]=buf[0];
			result[j+1]=buf[1];
			
			i++;
			j=j+2;
		}
		else			//是GB汉字
		{
			buf[1]=msg[i+1];
			buf[2]='\0';
			
			gb2312_to_unicode(buf);

			result[j]=buf[0];
			result[j+1]=buf[1];
			
			i=i+2;
			j=j+2;
		}
		result[j] = '\0';
	}
	return j;
}

//Send_Demo函数则会把所有内容插入到一个记录中,并插入DEMO。
static int Send_Demo(SEND_STRUC sendstruc,char *demo)
{
	char sql[2000];
	char s_msisdn[200],s_scr[21],s_fid[200],s_msg[2000];
	char day[20];

	if(sendstruc.nMsgFormat==0)	
	{
		sendstruc.nMsgFormat = 15;
	}
	
	strcpy(s_msisdn,sendstruc.sDesTermID);checksql(s_msisdn);
	if(strncmp(s_msisdn,"130",3) == 0 ||
	   strncmp(s_msisdn,"131",3) == 0 ||
	   strncmp(s_msisdn,"132",3) == 0 ||
	   strncmp(s_msisdn,"133",3) == 0 )
	{
		strncpy(sendstruc.sSrcTermID,"9020",4);
		strcpy(sendstruc.icpid,"UN");
	}
	else
	{
		strncpy(sendstruc.sSrcTermID,"5566",4);
		strcpy(sendstruc.icpid,"MO");
	}
	
	strcpy(s_fid,sendstruc.sFeeTerminalID);checksql(s_fid);
	strcpy(s_msg,sendstruc.sMsgContent);checksql(s_msg);
	
	sprintf(sql,"INSERT INTO COM_SEND_OTHER(ICPID,NEEDREPLY,MSGLEVEL,SERVICEID,MSGFORMAT,FEETYPE,FEECODE,VALIDTIME,ATTIME,SRCTERMID,DESTTERMID,MSGCONTENT,FEEUSERTYPE,FEETERMINALID,TPPID,TPUDHI,SEND_DATE,STEP,FLAG,DEMO)	VALUES('%s',%d,%d,'%s',%d,'%s','%.02f','','','%s','%s','%s',%d,'%s',%d,%d,'%s','0','0','%s')",	sendstruc.icpid,		sendstruc.nNeedReply,
		sendstruc.nMsgLevel,
		sendstruc.sServiceID,
		sendstruc.nMsgFormat,
		sendstruc.sFeeType,
		sendstruc.sFeeCode,
		sendstruc.sSrcTermID,
		s_msisdn,
		s_msg,
		sendstruc.cFeeUserType,
		s_fid,
		sendstruc.cTpPid,
		sendstruc.cTpUdhi,
		getnowdate(day),
		demo);
  if(DoSQL(sql,&myconn) != 0)
  {
  	writelog(SELF_TYPE,"发送信息错误!");
  	return -1;
  }
        
  return 0;
}

⌨️ 快捷键说明

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