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

📄 tool.cpp

📁 短信收发包程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <afx.h>
#include <afxDb.h>
#include <afxdisp.h>
#include <stdio.h>
#include <TCHAR.h>
#include <stdio.h>
#include <time.h>
//#include <winbase.h>
#include "stdafx.h"
//#include "dpl_types.h"
#include "Winsock2.h"

#include "GBBig5Unicode.h"
#include "ODBCRecordset.h"
#include "uwatchprotocol.h"

#include "tool.h"

#define sleep Sleep
void ReadConfig(char *file, char* title, char* token, char* value)
{
	char  buffer[1024];
	char  *readpoint,*ptr;
	char  tempstr[256];
	FILE  *fp;
	int   i;
	int   length;
	
	memset(tempstr,0,256);
	memset(buffer, 0,1024);
	if((fp=fopen(file,"r"))==NULL){
		printf("无法打开客户的配置文件,程序终止!");
		getchar();
		exit(1);
	}
	fseek(fp,0l,SEEK_SET);
	i=fread(buffer,1,1024,fp);
	ptr = buffer;
	readpoint=(char*)strstr((const char *)ptr,title);
	ptr = readpoint + strlen(title);
	readpoint=(char*)strstr((const char *)ptr,token);
	length=strlen(token);
	for(i=0;i<256;i++){
		if (*(readpoint+length+i)!='\n'){
			tempstr[i]=*(readpoint+length+i);
		}else{
			tempstr[i]='\0';
			break;
		}
	}
	strcpy(value,tempstr);
	fclose(fp);
	return;
}
BOOL WriteConfig(char *file, char* title, char* token, char* value)
{
	char  buffer[2048];
	char  *readpoint,*ptr;
	char  tempstr[256];
	FILE  *fp;
	int   i;
	int   length;
	long  filen;
	BOOL  ret;
	
	
	ret = true;
	memset(tempstr,0,256);
	memset(buffer, 0,2048);
	if((fp=fopen(file,"r+"))==NULL){
		printf("无法打开客户的配置文件,程序终止!");
        return false;
	}
	fseek(fp,0l,SEEK_SET);
	filen=fread(buffer,1,2048,fp);
	ptr = buffer;
	readpoint=(char*)strstr((const char *)ptr,title);
	ptr = readpoint + strlen(title);
	readpoint=(char*)strstr((const char *)ptr,token);
	length=strlen(token);
	strcpy(tempstr,value);
	for(i=0;i<256;i++){
		if (*(readpoint+length+i)!='\n'){
			*(readpoint+length+i)=tempstr[i];
		}else{
			//tempstr[i]='\0';
			if(i!=strlen(tempstr))
				ret = false;
			else
				ret = true;
			break;
		}
	}
	//	strcpy(value,tempstr);
	fseek(fp,0l,SEEK_SET);
	fwrite(buffer,1,filen,fp);
	fclose(fp);
	return ret;
}
void in_log(CString telno , CString msg)
{
	
	//记入日志
	FILE *fil;
	CString logfilnam;
	char logfile[30];
	char dir[255];
	CString recvstr;
	long beg,end;
	COleDateTime nowtime=COleDateTime::GetCurrentTime();
	
	ReadConfig("ttt.conf","[LOGFILE]","logfile=",logfile);
	::GetCurrentDirectory(255,dir);
	logfilnam=dir;
	logfilnam=logfilnam+"\\";
	logfilnam=logfilnam+logfile;
	if((fil=fopen(logfilnam,"r"))!=NULL)
	{
		fseek(fil,0,SEEK_SET);
		beg=ftell(fil);
		fseek(fil,0,SEEK_END);
		end=ftell(fil);
		fclose(fil);
	}
	else
	{
		beg=end=0;
		fil=fopen(logfilnam,"w");
		fclose(fil);
		
	}
	if(end-beg>=10000000)
		fil=fopen(logfilnam,"wb+");
	else
		fil=fopen(logfilnam,"ab+");
	recvstr=nowtime.Format("%Y-%m-%d %H:%M:%S");
	recvstr=recvstr+"(发送到";
	recvstr=recvstr+telno;
	recvstr=recvstr+"):";
	recvstr=recvstr+msg+"\n";
	fwrite(recvstr,1,recvstr.GetLength(),fil);
	fclose(fil);
}

//新代码结束

CString unicode2gb(unsigned char * source , int j)
{
	//TODO: Add your source code here
	TCHAR *dest;
	dest = new TCHAR[j+1];
	*dest = 0 ;
	UnicodeToGBCode(source,dest,j) ;
	CString rtn = CString(dest);
	delete [ ] dest;
	return rtn;
}
CString Sfz15To18(CString sfz15)
{
	CString sfz18;
    CString tem;
	int he=0;
	int w[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
	char trans[11]={'1','0','X','9','8','7','6','5','4','3','2'};
	
	tem=sfz15.Left(6)+"19"+sfz15.Mid(6,9);
	for(int i=0;i<17;i++)
	{
		int val;
		
		val=atoi(tem.Mid(i,1));
		he+=val*w[i];
	}
	tem=tem+trans[he%11];
    return tem;
}
CString Sfz17To18(CString sfz17)
{
	CString sfz18;
    CString tem;
	int he=0;
	int w[18]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1};
	char trans[11]={'1','0','X','9','8','7','6','5','4','3','2'};
	
	tem=sfz17;
	for(int i=0;i<17;i++)
	{
		int val;
		
		val=atoi(tem.Mid(i,1));
		he+=val*w[i];
	}
	tem=tem+trans[he%11];
    return tem;
}
unsigned long OccurPrimaryKey(CDatabase *db,CString phnum,char * retcon)
{
	unsigned char checkchar;
	CString s1;
	ENSMSREPORT* repack;
	CODBCRecordset*	rs ;
	uwatchprotocol cl1;
	int retval,len,msglenth;
	unsigned char tkey[200];
	unsigned char pkey[200];
	CString stkey, spkey;
	CString iis,iiserver;
	unsigned char tem[200];
	int ii = 256,iscount;
	unsigned char  resul[200];
	unsigned char msgcontent[200];
	unsigned char RanNum[8];
	unsigned char MacStr[4]; //MAC串
    INT64 pmsg_id;
    repack = new ENSMSREPORT();
	rs = new CODBCRecordset( db );
	s1 = "select * from t_ryqxgl where c_ydbs = '" + phnum + "'";
	rs->Open(s1);
	if(!rs->IsEOF())
	{
		stkey    = rs->GetString("c_tkey");
		iis      = rs->GetString("n_sim_counter");
		iiserver = rs->GetString("n_s_counter");
		ii       = atoi((char*)LPCTSTR(iis));
		iscount  = atoi((char*)LPCTSTR(iiserver));
		iscount++;        //服务器计数器增加1
		rs->Close();
	}
	else
	{
		rs->Close();
		//smsg      = "对不起,您的手机号未注册";
		checkchar = 1;//找不到手机号
		return 0;
	}
	
	
	memcpy(tkey, stkey, stkey.GetLength());
	memcpy(tkey,cl1.base64decode(tkey),16);
	tkey[16] = '\0';
	CString ENKey;
	
	//	smsg       = (CString)resul;
	//	strcpy(msgcontent,(char *)LPCTSTR(smsg));
	pkey[0]    = 0x10;
	cl1.DuctRanNum(RanNum,16);   //生成随机主密钥
	//ENKey = cl1.base64encode((unsigned char*)"ABCDABCDABCDABCD",16);
    ENKey = cl1.base64encode(RanNum,16);
	memcpy(pkey+1,RanNum,16);//服务器更新的主密钥
	pkey[16+1] = '\0';
	len = 17;
	spkey = CString(pkey);
	
	int ret = cl1.EncodeAndMac(len,pkey,tkey,RanNum,MacStr,resul);
	if(ret==0)
	{
		printf("\n生成主密钥校验码出错。");
		return -1;
	}
	if(ret==-1)
	{
		printf("\n主密钥加密出错。");
		return -1;
	}
	if(ret==1)
	{
		len = len%8==0?len:(len/8+1)*8;
		repack->SecurID = 0xF0;
		repack->Version = 0xF9;
		repack->AppType = 0x03;
		repack->Reserve1= 0x00;
		repack->EncryType = 0x12;
		repack->KeyVersion=0x01;//密钥版本号
		repack->SyncCount = 0xffff;//(计数器)
		memcpy(repack->RanNum,RanNum,8);
		memcpy(repack->EnData,resul,len);
		memcpy(repack->MacStr,MacStr,4);
		msglenth = 20+len;
		//msgcontent = new char[msglenth];
		memcpy(msgcontent,repack,msglenth);
		msgcontent[msglenth] = '\0';
		memcpy(retcon,msgcontent,msglenth);
		s1.Format(_T("update t_ryqxgl set c_pkey='%s',n_s_counter=%d where c_ydbs='%s'"),ENKey,iscount,phnum);
		db->ExecuteSQL(s1);
		return msglenth;
	}
}
int Get_Key(CString ph_num, CString& stkey, CString& spkey,CDatabase &db,int icount,CDatabase &mysqldb)
{
	
	CODBCRecordset*	rs ;
	CString strsql,iis,iiserver;
	int ii,iscount;
	int ret;
	char *sendcon = "您的手机号未注册,请与大队管理员联系!";
	TRY
	{
		rs = new CODBCRecordset( &db );
		strsql= "select * from t_ryqxgl where c_ydbs = '" + ph_num + "'";
		rs->Open(strsql);
		if(!rs->IsEOF())
		{
			stkey    = rs->GetString("c_tkey");
			spkey    = rs->GetString("c_pkey");
			iis      = rs->GetString("n_sim_counter");
			iiserver = rs->GetString("n_s_counter");
			ii       = atoi((char*)LPCTSTR(iis));
			iscount  = atoi((char*)LPCTSTR(iiserver));
			iscount++;        //服务器计数器增加1
			rs->Close();
			strsql.Format(_T("update t_ryqxgl set n_sim_counter=%d where c_ydbs='%s'"),icount,ph_num);
			db.ExecuteSQL(strsql);
		}
		else//发送不成功短信
		{
		strsql.Format("insert into submit_msg (icp_id,svc_type,fee_type,\
																		  info_fee,proto_id,msg_mode,priority,validate,shedule,fee_utype,\
																		  fee_user,src_addr,du_count,dst_addr,data_coding,sm_len,short_msg,\
																		  msg_state,tp_udhi,tp_pid,pk_total,pk_number) \
																		  values('930165','TXJ4919901',1,'0',0,1,9,'','',1,'',\
																		  '106573002110',1,'%s',15,'%d','%s',0,0,0,1,1) ",ph_num,strlen(sendcon),sendcon);
		mysqldb.ExecuteSQL(strsql);
		strsql.Format(_T("update t_ryqxgl set n_sim_counter=%d where c_ydbs='%s'"),icount,ph_num);
		db.ExecuteSQL(strsql);
		ret=-1;
		}
	} 
	CATCH(CDBException,e)
	{
		return -2;
	}
	END_CATCH
		return ret;
}
int Exe_2type(int icount ,int len,uwatchprotocol watchtest,struct ENSMSREPORT* repack,CString ph_num,CDatabase& db,CDatabase& mysqldb)
{
   	unsigned char tkey[20];
    unsigned char pkey[20];
	CString stkey;
	CString spkey;
	unsigned char EnData[200];
	int retval;
	int msglenth;
	unsigned char MacStr[4];
	unsigned char RanNum[8];
	unsigned char tem[16];
	unsigned char msgcontent[200];
	unsigned 	char* resul;
	unsigned char* ENKey;
	CString strsql,ENKEY;
	int ret=0;
	char *in_msg = "您的手机卡密码不正确,请与系统管理员联系!";
	char *c_msg = "服务器生成通信主密码不正确,请重试;如重试后仍不正确,请与系统管理员联系!";
	ret=Get_Key(ph_num,stkey,spkey, db, icount,mysqldb);
	if(ret!=0)
		return ret;
	memcpy(MacStr,repack->MacStr,4);
	memcpy(EnData,repack->EnData,len);
	memcpy(RanNum,repack->RanNum,8);
	memcpy(tkey, stkey, stkey.GetLength());
	memcpy(tkey,watchtest.base64decode(tkey),16);
	retval = watchtest.DecodeAndAuthMac(len,EnData,tkey,RanNum,MacStr,resul);
	if(retval!=1)//发送不正确提示
	{
	strsql.Format("insert into submit_msg (icp_id,svc_type,fee_type,\
																	  info_fee,proto_id,msg_mode,priority,validate,shedule,fee_utype,\
																	  fee_user,src_addr,du_count,dst_addr,data_coding,sm_len,short_msg,\
																	  msg_state,tp_udhi,tp_pid,pk_total,pk_number) \
																	  values('930165','TXJ4919901',1,'0',0,1,9,'','',1,'',\
																	  '106573002110',1,'%s',15,'%d','%s',0,0,0,1,1) ",ph_num,strlen(in_msg),in_msg);
	mysqldb.ExecuteSQL(strsql);
	return -1;
	}
	else
	{
		pkey[0]=0x10;
		watchtest.DuctRanNum(tem,16);   //生成随机主密钥
		ENKey= watchtest.base64encode(tem,16);
		memcpy(pkey+1,tem,16);//服务器更新的主密钥
		pkey[16+1] = '\0';
		len = 17;
		spkey = CString(pkey);
		retval = watchtest.EncodeAndMac(len,pkey,tkey,RanNum,MacStr,resul);
		if(retval!=1)//发送不正确的消息
		{
			//strsql
			strsql.Format("insert into submit_msg (icp_id,svc_type,fee_type,\
																			  info_fee,proto_id,msg_mode,priority,validate,shedule,fee_utype,\
																			  fee_user,src_addr,du_count,dst_addr,data_coding,sm_len,short_msg,\
																			  msg_state,tp_udhi,tp_pid,pk_total,pk_number) \
																			  values('930165','TXJ4919901',1,'0',0,1,9,'','',1,'',\
																			  '106573002110',1,'%s',15,'%d','%s',0,0,0,1,1) ",ph_num,strlen(c_msg),c_msg);
			mysqldb.ExecuteSQL(strsql);
		}
		else//发送密码数据
		{
			len = (len%8==0?len:(len/8+1)*8);
			memcpy(repack->EnData,resul,len);
			memcpy(repack->MacStr,MacStr,4);
			msglenth = 20+len;
			//msgcontent = new char[msglenth];
			memcpy(msgcontent,repack,msglenth);
			msgcontent[msglenth] = '\0';
			strsql.Format("insert into submit_msg (icp_id,svc_type,fee_type,\
																			  info_fee,proto_id,msg_mode,priority,validate,shedule,fee_utype,\
																			  fee_user,src_addr,du_count,dst_addr,data_coding,sm_len,short_msg,\
																			  msg_state,tp_udhi,tp_pid,pk_total,pk_number) \
																			  values('930165','TXJ4919901',1,'0',0,1,9,'','',1,'',\
																			  '106573002110',1,'%s',246,'%d','%s',0,0,127,1,1) ",ph_num,msglenth,msgcontent);
			mysqldb.ExecuteSQL(strsql);
			//			strsql.Format(_T("update t_ryqxgl set c_pkey='%s',n_s_counter=%d where c_ydbs='%s'"),ENKey,iscount,destmobile);
			db.ExecuteSQL(strsql);
		}
	}
	return 0;
}

int Exe_1type(int icount ,CString dst_addr,int len,uwatchprotocol watchtest,struct ENSMSREPORT* repack,CString ph_num,CDatabase& db,CDatabase& mysqldb)
{
	unsigned char tkey[20];
	unsigned char pkey[20];
	CString stkey;
	CString spkey;
	char EnData[160];
	unsigned char data[160];
	int retval;
	int msglenth;
	unsigned char MacStr[4];
	unsigned char RanNum[8];
	unsigned char msgcontent[200];
	unsigned 	char* resul;
	unsigned long EnLen;
	CString strsql,ENKEY;
	CString midtem,temp;
	int pos,c;
	char tem[100];
	char *smstem;
	char * temmid;
	int smslen;
	int bmflag;
	int ret;
	CODBCRecordset*	rs ;
	ret=Get_Key(ph_num,stkey,spkey, db, icount,mysqldb);
	if(ret!=0)
		return ret;
	memcpy(MacStr,repack->MacStr,4);
	memcpy(data,repack->EnData,len);
	memcpy(RanNum,repack->RanNum,8);
	memcpy(pkey, spkey, spkey.GetLength());
	memcpy(tkey,watchtest.base64decode(tkey),16);
	//	retval = watchtest.DecodeAndAuthMac(len,EnData,tkey,RanNum,MacStr,resul);
	retval = watchtest.DecodeAndAuthMac(len,data,pkey,RanNum,MacStr,resul);
	resul[len] = '\0';
	if(retval!=1)//发送更新密钥信息
	{
		EnLen = OccurPrimaryKey(&db,ph_num,EnData);
		strsql.Format("insert into submit_msg (icp_id,svc_type,fee_type,\
																		  info_fee,proto_id,msg_mode,priority,validate,shedule,fee_utype,\
																		  fee_user,src_addr,du_count,dst_addr,data_coding,sm_len,short_msg,\
																		  msg_state,tp_udhi,tp_pid,pk_total,pk_number) \
																		  values('930165','TXJ4919901',1,'0',0,1,9,'','',1,'',\
																		  '106573002110',1,'%s',246,'%d','%s',0,0,127,1,1) ",ph_num,EnLen,EnData);
		mysqldb.ExecuteSQL(strsql);
		
	}
	else//将信息填写到请求信息表中
	{
		CString		smsg = "";
		bmflag = 0;
		smslen = (int)resul[0];
		smstem = (char*)(resul+1);
		smstem[smslen] = '\0';
		temmid = (char *)memchr(smstem,'&',smslen);
		if(temmid == NULL)
		{
			smstem[smslen]='\0';
			smsg = smstem;
		}
		while(temmid!=NULL)
		{//具有Unicode编码
			char smsgtem[100];
			int len,len1;
			unsigned char sms[100];
			char* tem1;
			len = temmid - smstem;
			memcpy(smsgtem,smstem,len);
			smsgtem[len] = '\0';
			smsg = smsg + smsgtem;
			smstem = temmid + 1;
			smslen = smslen - len - 1;
			len = smslen;
			len1= 0;
			temmid = smstem + 1;
			tem1 = smstem;
			
			while((temmid-smstem)%2==1)
			{
				temmid = (char*)memchr(tem1,' ',smslen);
				if(temmid!=NULL)
				{
					smslen = smslen - (temmid - smstem) - 1;
					tem1 = temmid + 1;
					len1 = temmid - smstem + 1;
				}
				else
				{
					//if (len < smslen)
					len = len1 + smslen;
					break;
				}
			}
			memcpy(tem,smstem,len);
			tem[len] = '\0';
			
			for (int i1=0;i1<len/2;i1++)
			{
				char tr;
				tr = tem[i1*2];
				tem[i1*2] = tem[i1*2+1];
				tem[i1*2+1] = tr;
			}
			//LPWSTR abc = (LPWSTR)tem;
			len = WideCharToMultiByte(CP_ACP,NULL,(LPWSTR)tem,len/2,(char*)sms,100,NULL,NULL);
			sms[len] = '\0';
			smsg = smsg + sms;
			if(bmflag) //bmflag = 0;
				temmid = (char *)memchr(smstem,' ',smslen);
			else
				temmid = (char *)memchr(smstem,'&',smslen);
		}
		printf("\nreceive sms %s",smsg);
		CString smsg1 = smsg + "'";
		rs = new CODBCRecordset(& db );
		if (smsg1.Find("'",0)<0)
			smsg = smsg1;
		strsql= "SELECT * FROM T_JT_DXQQB where c_sjhm='XX'";
		rs->Open(strsql);
		db.BeginTrans();

⌨️ 快捷键说明

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