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

📄 func.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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(&timestamp);
	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 + -