📄 func.cpp
字号:
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
if(iCurrent<(int)tm.dwSequence)return ExitFromNetClose;
}//try
catch (_com_error &e)
{
AddLog("Sender SQL error<%s>.\n",strSQL);
AddLog("Description = '%s'\n", (char*) e.Description());
if(pCnnGSM->GetState())pCnnGSM->Close();
::CoUninitialize();
return 1;
}
}//END of while(1)
return NOERROR;
}
DWORD WINAPI MOThread(LPVOID pp)
{
cmppe_packet cp;
int iRecvMsg,stat,i,j;
unsigned int seq_id;
char msgbuffer[320];
char strSQL[512];
_ConnectionPtr pCnnGSM=NULL;
if(arg.isDebug)AddLog("enter mo thread.\n");
while(1)SleepEx(10000,1);
try{
::CoInitialize(NULL);
TESTHR(pCnnGSM.CreateInstance(__uuidof(Connection)));
TESTHR(pCnnGSM->Open(arg.strCnn,"","",adConnectUnspecified));
iRecvMsg=0;
while(1)
{
if(arg.isActive<1){SleepEx(500,1);continue;}
arg.dwRecv++;
memset(&cp,0,sizeof(cp));
#if ONESECTION2
EnterCriticalSection(&(arg.syc2));
#endif
stat = cmpp_recv(&arg.conn,&cp,0,&seq_id);
#if ONESECTION2
LeaveCriticalSection(&(arg.syc2));
#endif
if(stat != DPL_SUCCESS)
{
return ExitFromNetClose;
}
arg.dwRecv++;
if(arg.isDebug>1)AddLog("[type=%08x][status=%03x][seq=%08x][result=%02x]\n",
cp.pk_head.pk_cmd,cp.pk_head.pk_stat,cp.pk_head.pk_seq,cp.result);
switch(cp.pk_head.pk_cmd)
{
case CMPPE_ACTIVE://over
cmpp_active_test(&arg.conn);
break;
case CMPPE_SUBMIT_RESP:
if(cp.pk_head.pk_stat)
{
if(arg.isDebug)AddLog("submit error for %.3x\n",cp.pk_head.pk_stat);
sprintf(strSQL,"exec sp_send_mt_error %d,%d,%d",
arg.iChannelNum,cp.pk_head.pk_seq,cp.pk_head.pk_stat);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
}else
{
sprintf(strSQL,"exec sp_send_mt_resp %d,%d,'%s'",
arg.iChannelNum,cp.pk_head.pk_seq,cp.pk_data.pk_submit_resp.msg_id);
if(arg.isDebug)AddLog("submit:<%s>\n",strSQL);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
AddResp("Resp",0,"%d,%d,%s\n",
arg.iChannelNum,cp.pk_head.pk_seq,cp.pk_data.pk_submit_resp.msg_id);
}
break;
case CMPPE_ACTIVE_RESP://over
break;
case CMPPE_LOGOUT_RESP:
AddLog("Unbind from VAS platform.\n");
break;
case CMPPE_DELIVER:
if(cp.pk_data.pk_deliver.status_rpt == 1)//state report comes here
{
sprintf(strSQL,"EXEC SP_STATE_REPORT %d,'%s','%.21s','%d'",
arg.iChannelNum,
cp.pk_data.pk_deliver.pk_sm.sm_rpt.msg_id,
cp.pk_data.pk_deliver.src_addr,//dst_termid,skim 86
cp.pk_data.pk_deliver.pk_sm.sm_rpt.final_status//state
);
AddResp("state",0,"%d,%s,%.21s,%d\n",arg.iChannelNum,
cp.pk_data.pk_deliver.pk_sm.sm_rpt.msg_id,
cp.pk_data.pk_deliver.dst_addr,//dst_termid,skim 86
cp.pk_data.pk_deliver.pk_sm.sm_rpt.final_status);
}else
{//msg goes here
if(cp.pk_data.pk_deliver.data_coding<8||cp.pk_data.pk_deliver.data_coding==15)
for(i=0;i<cp.pk_data.pk_deliver.sm_len;i++)
sprintf(msgbuffer+i*2,"%.2x",(BYTE)(cp.pk_data.pk_deliver.pk_sm.short_msg[i]));
else
{
if(j=UCS2toGB(cp.pk_data.pk_deliver.pk_sm.short_msg,
strSQL,cp.pk_data.pk_deliver.sm_len))
for(i=0;i<j;i++)
sprintf(msgbuffer+i*2,"%.2x",(BYTE)(strSQL[i]));
else msgbuffer[0]=0;
cp.pk_data.pk_deliver.data_coding=15;
}
//ismg_id,src,msg,msg_format,dst,channel,linkid
sprintf(strSQL,"exec sp_insert_mo '%d','%s',0x%s,%d,'%s',%d,'%d'",
cp.pk_head.pk_seq,
cp.pk_data.pk_deliver.src_addr,//src_termid
msgbuffer,//msg
cp.pk_data.pk_deliver.data_coding,//msg_format
cp.pk_data.pk_deliver.dst_addr,//dst_termid
arg.iChannelNum,//channel number.
cp.pk_head.pk_seq//
);
AddResp("MO",0,"%d,%s,0x%s,%d,%s,%d,%d\n",
cp.pk_head.pk_seq,
cp.pk_data.pk_deliver.src_addr,//src_termid
msgbuffer,//msg
cp.pk_data.pk_deliver.data_coding,//msg_format
cp.pk_data.pk_deliver.dst_addr,//dst_termid
arg.iChannelNum,//channel number.
cp.pk_head.pk_seq//
);
}
if(arg.isDebug)AddLog("%s\n",strSQL);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute(strSQL,NULL,adExecuteNoRecords);
#if ONESECTION1
EnterCriticalSection(&(arg.syc1));
#endif
stat = cmpp_deliver_resp(&arg.conn,cp.pk_head.pk_seq,0);
#if ONESECTION1
LeaveCriticalSection(&(arg.syc1));
#endif
if(stat != DPL_SUCCESS)
{
return 0;
}
break;
}//end of swtich the type of the package
}//end of while 1
}//end of try
catch (_com_error &e)
{
AddLog("Mothread error for '%s'\n", (char*) e.Description());
if(pCnnGSM->GetState())pCnnGSM->Close();
::CoUninitialize();
return -1;
}
::CoUninitialize();
return 0;
}
DWORD WINAPI MOFun(CMSG *msg,_ConnectionPtr pCnnGSM)
{
cmppe_packet cp;
int stat,i,j;
unsigned int seq_id;
char msgbuffer[320];
char strSQL[512];
try{
while(1)
{
if(arg.isActive<1){SleepEx(500,1);continue;}
arg.dwRecv++;
memset(&cp,0,sizeof(cp));
stat = cmpp_recv(&arg.conn,&cp,0,&seq_id);
if(stat != DPL_SUCCESS)return ExitFromNetClose;
arg.dwRecv++;
if(cp.result)return cp.result;
if(arg.isDebug>1)AddLog("[type=%08x][status=%03x][seq=%08x][result=%02x]\n",
cp.pk_head.pk_cmd,cp.pk_head.pk_stat,cp.pk_head.pk_seq,cp.result);
switch(cp.pk_head.pk_cmd)
{
case CMPPE_ACTIVE://over
cmpp_active_test(&arg.conn);
break;
case CMPPE_SUBMIT_RESP:
if(cp.pk_head.pk_seq==msg->seq_id)
{
if(cp.pk_head.pk_stat)
{
if(arg.isDebug)AddLog("submit error for %.3x\n",cp.pk_head.pk_stat);
sprintf(strSQL,"exec sp_send_mt_error %d,%d,%d",
arg.iChannelNum,msg->dwSequence,cp.pk_head.pk_stat);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
}
else
{
//channle,msg_id,cp_id,dst,src,feedst,service_id,feetype,isReply,ismg_id
sprintf(strSQL,"exec sp_send_mt_resp %d,%d,'%s'",
arg.iChannelNum,msg->dwSequence,cp.pk_data.pk_submit_resp.msg_id);
if(arg.isDebug)AddLog("submit:<%s>\n",strSQL);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
AddResp("Resp",0,"%d,%d,%s\n",
arg.iChannelNum,msg->dwSequence,cp.pk_data.pk_submit_resp.msg_id);
}
return 0;
}
if(cp.pk_head.pk_stat)
{
if(arg.isDebug)AddLog("submit error for %.3x\n",cp.pk_head.pk_stat);
sprintf(strSQL,"exec sp_send_mt_error %d,%d,%d",
arg.iChannelNum,msg->seq_id,cp.pk_head.pk_stat);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
}else
{
sprintf(strSQL,"exec sp_send_mt_resp %d,%d,'%s'",
arg.iChannelNum,cp.pk_head.pk_seq,cp.pk_data.pk_submit_resp.msg_id);
if(arg.isDebug)AddLog("submit:<%s>\n",strSQL);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
AddResp("Resp",0,"%d,%d,%s\n",
arg.iChannelNum,cp.pk_head.pk_seq,cp.pk_data.pk_submit_resp.msg_id);
}
break;
case CMPPE_ACTIVE_RESP://over
break;
case CMPPE_LOGOUT_RESP:
AddLog("Unbind from VAS platform.\n");
break;
case CMPPE_DELIVER:
if(cp.pk_data.pk_deliver.status_rpt == 1)//state report comes here
{
sprintf(strSQL,"EXEC SP_STATE_REPORT %d,'%s','%.21s','%d'",
arg.iChannelNum,
cp.pk_data.pk_deliver.pk_sm.sm_rpt.msg_id,
cp.pk_data.pk_deliver.src_addr,//dst_termid,skim 86
cp.pk_data.pk_deliver.pk_sm.sm_rpt.final_status//state
);
AddResp("status",0,"%d,%s,%.21s,%d\n",arg.iChannelNum,
cp.pk_data.pk_deliver.pk_sm.sm_rpt.msg_id,
cp.pk_data.pk_deliver.dst_addr,//dst_termid,skim 86
cp.pk_data.pk_deliver.pk_sm.sm_rpt.final_status);
}else
{//msg goes here
if(cp.pk_data.pk_deliver.data_coding<8||cp.pk_data.pk_deliver.data_coding==15)
for(i=0;i<cp.pk_data.pk_deliver.sm_len;i++)
sprintf(msgbuffer+i*2,"%.2x",(BYTE)(cp.pk_data.pk_deliver.pk_sm.short_msg[i]));
else
{
if(j=UCS2toGB(cp.pk_data.pk_deliver.pk_sm.short_msg,
strSQL,cp.pk_data.pk_deliver.sm_len))
for(i=0;i<j;i++)
sprintf(msgbuffer+i*2,"%.2x",(BYTE)(strSQL[i]));
else msgbuffer[0]=0;
cp.pk_data.pk_deliver.data_coding=15;
}
//ismg_id,src,msg,msg_format,dst,channel,linkid
sprintf(strSQL,"exec sp_insert_mo '%d','%s',0x%s,%d,'%s',%d,'%d'",
cp.pk_head.pk_seq,
cp.pk_data.pk_deliver.src_addr,//src_termid
msgbuffer,//msg
cp.pk_data.pk_deliver.data_coding,//msg_format
cp.pk_data.pk_deliver.dst_addr,//dst_termid
arg.iChannelNum,//channel number.
cp.pk_head.pk_seq//
);
AddResp("MO",0,"%d,%s,0x%s,%d,%s,%d,%d\n",cp.pk_head.pk_seq,
cp.pk_data.pk_deliver.src_addr,//src_termid
msgbuffer,//msg
cp.pk_data.pk_deliver.data_coding,//msg_format
cp.pk_data.pk_deliver.dst_addr,//dst_termid
arg.iChannelNum,//channel number.
cp.pk_head.pk_seq);
}
if(arg.isDebug)AddLog("%s\n",strSQL);
pCnnGSM->Errors->Clear();
pCnnGSM->Execute(strSQL,NULL,adExecuteNoRecords);
stat = cmpp_deliver_resp(&arg.conn,cp.pk_head.pk_seq,0);
if(stat != DPL_SUCCESS)return ExitFromNetClose;
break;
}//end of swtich the type of the package
if((msg->dwCommand+0x80000000)==cp.pk_head.pk_cmd)break;
}//end of while 1
}//end of try
catch (_com_error &e)
{
AddLog("MOFun error for '%s'\n", (char*) e.Description());
if(pCnnGSM->GetState())pCnnGSM->Close();
::CoUninitialize();
return -1;
}
return 0;
}
GW_API void StopGW()
{
AddLog("Send msg to stop GW.\n");
if(arg.hGW!=NULL)SetEvent(arg.hGW);
#if ONESECTION1
DeleteCriticalSection(&(arg.syc1));
#endif
#if ONESECTION2
DeleteCriticalSection(&(arg.syc2));
#endif
#if ONESECTION3
DeleteCriticalSection(&(arg.syc3));
#endif
}
void AddBinLog(char* buffer,int i,int flag=0)
{
int j=0;
FILE* pfLog;
char current[36];
char tp[36];
struct _timeb timebuffer;
char lpFileName[MAX_PATH];
if(arg.isDebug<3)return;
_strdate(current);
_ftime(&timebuffer);
strcpy(tp,ctime(&(timebuffer.time)));
current[2]='_';
current[5]=0;
tp[strlen(tp)-1]=0;
GetModuleFileName(NULL,lpFileName,MAX_PATH);
sprintf(strrchr(lpFileName,'\\')+1,"Bin%s_%s.txt\0",strrchr(tp,' ')+1,current);
current[2]='-';
tp[strrchr(tp,' ')-tp]=0;
pfLog=fopen(lpFileName,"a");
if(pfLog==NULL)return;
_strtime(tp);
fprintf(pfLog,"<%s.%.3u\t%d-%d>\n",
tp,timebuffer.millitm,flag,arg.iChannelNum);
for(j=0;j<i;j++)
{
if((j%16)==0)fprintf(pfLog,"0x%.8x ",j);
fprintf(pfLog,"%.2x ",*(BYTE*)(buffer+j));
if((j+1)%16==0)
{
fprintf(pfLog," ");
for(int k=0;k<16;k++)
if(buffer[j-15+k]<126&&buffer[j-15+k]>20)
fwrite(buffer+j-15+k,1,1,pfLog);
else fprintf(pfLog,".");
fprintf(pfLog,"\n");
}
}
if(i%16>0)
{
j=16-i%16;
for(;j>0;j--)
fprintf(pfLog," ");
fprintf(pfLog," ");
for(int k=0;k<j;k++)
if(buffer[j-15+k]<126&&buffer[j-15+k]>20)
fwrite(buffer+i-j+k,1,1,pfLog);
else fprintf(pfLog,".");
}
fprintf(pfLog,"\n");
fflush(pfLog);
fclose(pfLog);
}
dpl_status_t login_value_set(cmppe_login *cl)
{
time_t timestamp;
time(×tamp);
strcpy(cl->icp_id,arg.spid);
strcpy(cl->icp_auth,arg.password);
cl->icp_bind_type = 2;//0:send,1:recv,2:s&r
cl->if_version = 0x12;
cl->icp_timestamp = timestamp;
return DPL_SUCCESS;
}
dpl_status_t submit_value_set(cmppe_submit *cs,CMSG tm)
{
int j;
char tp[21];
char msg[281];
BYTE b,msg_mode;
cmppe_submit_sm_init(cs);
if(tm.msg_format==0||tm.msg_format==15)
{
strncpy(msg,tm.szContent,160);
b=strlen(tm.szContent);
}else
{
for(j=0;j<(int)strlen(tm.szContent)/2;j++)
{
sprintf(tp,"0x%.2s\0",tm.szContent+j*2);
sscanf(tp,"%x",&b);
msg[j]=b;
}
b=strlen(tm.szContent)/2;
}
cmppe_submit_sm_set_shortmsg(cs, msg,b);
cmppe_submit_sm_set_priority(cs, 0);
if(tm.isReply==2)tm.isReply=3;
msg_mode=tm.isReply;
if(tm.bUDHI)msg_mode&=8;
cmppe_submit_sm_set_msgmode (cs, msg_mode);
cmppe_submit_sm_set_protoid (cs, tm.bPID);
cmppe_submit_sm_set_dcs (cs, tm.msg_format);
cmppe_submit_sm_set_schedule(cs, "");
cmppe_submit_sm_set_validate(cs, "");
cmppe_submit_sm_set_src_addr(cs, tm.SrcTermId);
//for(j=0;j<nMobile;j++){
//cmppe_submit_sm_add_dst_addr(cs, mobile[j]);
cmppe_submit_sm_add_dst_addr(cs,tm.DstTermId);
//}
cmppe_submit_sm_set_icp_id (cs, arg.spid);
cmppe_submit_sm_set_svc_type(cs, tm.szServiceID);//1027001999
cmppe_submit_sm_set_fee_type(cs, tm.FeeType);//free
cmppe_submit_sm_set_info_fee(cs, tm.FeeCode);//fee zero
cmppe_submit_sm_set_fee_user(cs, tm.bFeeUserType, tm.FeeUser);//fee by sp
return 0;
}
DWORD SendData(CMSG *msg)
{
unsigned int seq;
cmppe_submit cs;
submit_value_set(&cs,*msg);
return cmpp_submit(&arg.conn,&cs,&seq);
}
void SendCheck(char* szService)
{
SOCKET s=connectTCP("127.0.0.1","9009");
if(s==INVALID_SOCKET)return;
SendBuffer(s,szService,strlen(szService));
closesocket(s);
}
int SendBuffer(SOCKET s,char* buffer,int buf_len)
{
int i,j;
i=j=0;
while(i<buf_len)
{
j=send(s,buffer+i,buf_len-i,0);
if(j<1)
{
AddLog("send socket error for: %d\n",WSAGetLastError());
if(i>0)AddBinLog(buffer,i,1);
return ExitFromNetClose;
}
i+=j;
}
AddBinLog(buffer,i,0);
return 0;
}
int UCS2toGB(char* src,char* dst,int len)
{
WORD wRead;
WORD tp[1024];
char str[2048];
if(len>2048)return 0;
for(int i=0;i<len/2;i++)tp[i]=(WORD)GetNByte(src+i*2,2);
wRead=WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tp,len/2,
dst,len,NULL,NULL);
str[wRead]=0;
return wRead;
}
int GBtoUCS2(char* src,char* dst)
{
WORD wRead;
WORD tp[141];
char tmp[281];
wRead=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,src,strlen(src),
tp,140);
for(WORD i=0;i<wRead;i++)
sprintf(tmp+i*4,"%.4x",tp[i]);
strcpy(dst,tmp);
return wRead;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -