📄 tool.cpp
字号:
#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 + -