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

📄 func.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	i+=4;
	if(msg->dwCommand>0x80000000)
	{
		PutNByte(buffer+i,4,msg->dwSequence);
		i+=4;
		PutNByte(buffer+i,4,msg->dwSequence2);
		i+=4;
		PutNByte(buffer+i,4,msg->dwSequence3);
		i+=4;
	}
	else
	{
		sprintf(tmp,"%s\0",arg.SrcId);
		PutNByte(buffer+i,4,atoi(tmp));
		i+=4;
		PutNByte(buffer+i,4,GetTime());
		i+=4;	
		PutNByte(buffer+i,4,arg.dwSequence);
		i+=4;
	}
	switch(msg->dwCommand)
	{
	case SGIP_SUBMIT:// 3
		/////////////////////////////////
		i-=4;
		PutNByte(buffer+i,4,msg->dwSequence);
		i+=4;
		sprintf(buffer+i,"%.21s\0",msg->SrcTermId);//8375
		//if(arg.isDebug)AddLog("spNumber: %s\n",arg.SPNumber);
		i+=21;
#if 0
		if(msg->FeeType==4&&msg->DstTermId[2]!='3')//fee by sp
		sprintf(buffer+i,"%.21s\0",arg.szManager);
		else if(msg->FeeType==4&&msg->DstTermId[2]=='3')//fee by sp
		sprintf(buffer+i,"%.21s\0",arg.szFee_term);
		else sprintf(buffer+i,"%.21s\0",msg->FeeUser);//fee by user
#else
		sprintf(buffer+i,"%.21s\0",msg->FeeUser);
#endif
		i+=21;
		
		buffer[i]=1;//usercount
		i++;
		sprintf(buffer+i,"%s",msg->DstTermId);
		i+=21;
		sprintf(buffer+i,"%s\0",arg.SPID);//31063
		i+=5;
		sprintf(buffer+i,"%s\0",msg->szServiceID);
		i+=10;
		buffer[i]=msg->FeeType;
		i+=1;
		sprintf(buffer+i,"%d\0",msg->FeeCode);
		i+=6;
		sprintf(buffer+i,"%d\0",0);//GivenValue
		i+=6;
		buffer[i]=0;//if not fee by sp, agent
		i++;
		if(msg->isReply==3)
			buffer[i]=3;
		else if(msg->szServiceID[0]=='-')//down msg
		buffer[i]=2;//msg reason
		else buffer[i]=0;//msg reason: reply for up msg
		i++;
		buffer[i]=0;//msg level
		i++;
		memcpy(buffer+i,msg->ExpireTime,16);//expire time
		i+=16;
		memset(buffer+i,0,16);//send right now
		i+=16;
		buffer[i]=msg->isReply;//need_reply any time
		i++;
		buffer[i]=(BYTE)msg->bPID;
		i++;
		buffer[i]=(BYTE)msg->bUDHI;
		i++;
		buffer[i]=(BYTE)msg->msg_format;
		i++;
		buffer[i]=0;//message type
		i++;
		if(msg->msg_format==0||msg->msg_format==15)
		{
			//if(strlen(msg->szContent)<=160)
				PutNByte(buffer+i,4,strlen(msg->szContent));
			//else PutNByte(buffer+i,4,160);

			i+=4;
			strcpy(buffer+i,msg->szContent);
			i+=GetNByte(buffer+i-4,4);
		}
		else
		{
			PutNByte(buffer+i,4,strlen(msg->szContent)/2);
			i+=4;
			for(int j=0;j<(int)GetNByte(buffer+i-4,4);j++)
			{
				sprintf(tmp,"0x%.2s\0",msg->szContent+j*2);
				sscanf(tmp,"%x",&b);
				buffer[i+j]=b;
			}
			i+=GetNByte(buffer+i-4,4);
		}
		sprintf(buffer+i,"%.sd",msg->sLinkID);
		i+=8;
		break;
	case SGIP_BIND_RESP:// over
		buffer[i]=(BYTE)(msg->dwResult);
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case SGIP_BIND:// over
		buffer[i]=1;//login type=1: sp to smg
		i++;
		Jstrncpy(buffer+i,arg.LoginName,16);
		i+=16;
		Jstrncpy(buffer+i,arg.Password,16);
		i+=16;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case  SGIP_UNBIND://over
		break;
	case  SGIP_UNBIND_RESP://over
		break;
	case  SGIP_REPORT_RESP://over
		buffer[i]=(BYTE)(msg->dwResult);
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case  SGIP_DELIVER_RESP://over
		buffer[i]=(BYTE)msg->dwResult;
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	}
	PutNByte(buffer,4,i);
	AddBinLog(buffer,i,1);
	return i;
}

DWORD SendData(CMSG *msg)
{
	int i,j,k;
	WORD wAlive;
	char buffer[SMPPMAXLENGTH];
	unsigned __int16 tp;
	
	DWORD dwCommand=0;
	char tmp[50];
	BYTE b;
	tp=j=k=i=0;
	i+=4;
	PutNByte(buffer+i,4,dwCommand=msg->dwCommand);
	i+=4;
	if(msg->dwCommand>0x80000000)
	{
		PutNByte(buffer+i,4,msg->dwSequence);
		i+=4;
		PutNByte(buffer+i,4,msg->dwSequence2);
		i+=4;
		PutNByte(buffer+i,4,msg->dwSequence3);
		i+=4;
	}
	else
	{
		sprintf(tmp,"%s\0",arg.SrcId);
		PutNByte(buffer+i,4,atoi(tmp));
		i+=4;
		PutNByte(buffer+i,4,msg->dwSequence2=GetTime());
		i+=4;	
		PutNByte(buffer+i,4,msg->dwSequence3=arg.dwSequence);
		i+=4;
	}
	switch(msg->dwCommand)
	{
	case SGIP_SUBMIT:// 3
		/////////////////////////////////
		i-=4;
		PutNByte(buffer+i,4,msg->dwSequence3=msg->dwSequence);
		i+=4;
		sprintf(buffer+i,"%.21s\0",msg->SrcTermId);//8375
		//if(arg.isDebug)AddLog("spNumber: %s\n",arg.SPNumber);
		i+=21;
		sprintf(buffer+i,"%.21s\0",msg->FeeUser);
		i+=21;
		
		buffer[i]=1;//usercount
		i++;
		sprintf(buffer+i,"%s",msg->DstTermId);//dst_termid
		i+=21;
		sprintf(buffer+i,"%s\0",arg.SPID);//31063
		i+=5;
		sprintf(buffer+i,"%s\0",msg->szServiceID);//service type
		i+=10;
		buffer[i]=msg->FeeType;//fee_type
		i+=1;
		sprintf(buffer+i,"%d\0",msg->FeeCode);
		i+=6;
		sprintf(buffer+i,"%d\0",0);//GivenValue
		i+=6;
		buffer[i]=0;//if not fee by sp, agent
		i++;
		//momtflag:
		buffer[i]=(BYTE)msg->bReason;
		i++;
		buffer[i]=0;//msg level
		i++;
		memcpy(buffer+i,msg->ExpireTime,16);//expire time
		i+=16;
		memset(buffer+i,0,16);//send right now
		i+=16;
		buffer[i]=msg->isReply;//need_reply any time
		i++;
		buffer[i]=(BYTE)msg->bPID;//pid
		i++;
		buffer[i]=(BYTE)msg->bUDHI;
		i++;
		buffer[i]=(BYTE)msg->msg_format;
		i++;
		buffer[i]=0;//message type
		i++;
		if(msg->msg_format==0||msg->msg_format==15)
		{
			//if(strlen(msg->szContent)<=160)
				PutNByte(buffer+i,4,strlen(msg->szContent));
			//else PutNByte(buffer+i,4,160);

			i+=4;
			strcpy(buffer+i,msg->szContent);
			i+=GetNByte(buffer+i-4,4);
		}
		else
		{
			PutNByte(buffer+i,4,strlen(msg->szContent)/2);
			i+=4;
			for(int j=0;j<(int)GetNByte(buffer+i-4,4);j++)
			{
				sprintf(tmp,"0x%.2s\0",msg->szContent+j*2);
				sscanf(tmp,"%x",&b);
				buffer[i+j]=b;
			}
			i+=GetNByte(buffer+i-4,4);
		}
		sprintf(buffer+i,"%.8s",msg->sLinkID);
		i+=8;
		break;
	case SGIP_BIND_RESP:// over
		buffer[i]=(BYTE)(msg->dwResult);
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case SGIP_BIND:// over
		buffer[i]=1;//login type=1: sp to smg
		i++;
		Jstrncpy(buffer+i,arg.LoginName,16);
		i+=16;
		Jstrncpy(buffer+i,arg.Password,16);
		i+=16;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case  SGIP_UNBIND://over
		break;
	case  SGIP_UNBIND_RESP://over
		break;
	case  SGIP_REPORT_RESP://over
		buffer[i]=(BYTE)(msg->dwResult);
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	case  SGIP_DELIVER_RESP://over
		buffer[i]=(BYTE)msg->dwResult;
		i++;
		memset(buffer+i,0,8);
		i+=8;
		break;
	}
	PutNByte(buffer,4,i);
	AddBinLog(buffer,i,3);
	memset(msg->szContent,0,32);
	i=j=0;
	while(i<(int)GetNByte(buffer,4))
	{
		j=send(arg.s,buffer+i,GetNByte(buffer,4)-i,0);
		if(j<1)return ExitFromNetClose;
		i+=j;
	}
	i=j=0;
	//i=the bytes of the message received
	memset(buffer,0,sizeof(buffer));
	while(GetNByte(buffer+4,4)<0x80000000)
	{		
		while(i<4)
		{
			j=recv(arg.s,buffer+i,4-i,0);
			if(j<1)return ExitFromNetClose;
			i+=j;
		}
		while(i<(int)GetNByte(buffer,4))
		{
			j=recv(arg.s,buffer+i,GetNByte(buffer,4)-i,0);
			if(j<1)return ExitFromNetClose;
			i+=j;
		}
		if(GetNByte(buffer+4,4)<0x80000000)SleepEx(500,1);
		else
		AddBinLog(buffer,i,2);
		switch(GetNByte(buffer+4,4))
		{
			case SGIP_BIND_RESP:
				if(buffer[20])
				{
					AddLog("Bind to SMSC error for <%d>\n",buffer[20]);
					return 99;
				}
				wAlive=0;
				if(arg.isDebug)AddLog("Bind result is coming.\n");
				return 0;
			break;
			case SGIP_SUBMIT_RESP:
				arg.isActive=2;
				if(buffer[20])//submit with error
				{

					if(arg.isDebug)
					AddLog("submit error for<%d> on msg (%.10d-%d)\n",
						buffer[20],GetNByte(buffer+12,4),GetNByte(buffer+16,4));
					return buffer[20];
				}
				else 
				{
					sprintf(msg->szContent,"%.10d%d\0",
						msg->dwSequence2,msg->dwSequence3);
				}
			break;
			case SGIP_UNBIND_RESP:
				AddLog("Unbind from VAS platform.\n");
				closesocket(arg.s);
			break;
			case SGIP_UNBIND:
				AddLog("get unbind command from server!\n");
				return ExitFromNetClose;
				break;
			}//end of swtich the type of the package
			//end of processing a package.
	}
	return 0;
}
int Jstrchr(const char* s,char c)
{
	WORD i;
	if(s==NULL)return -1;
	if(strlen(s)<1)return -1;
	for(i=0;i<strlen(s);i++)
	{
		if(s[i]==c)return i;
	}
	return strlen(s);
}
bool GetArg(CArg* arg)
{
	FILE* pf=NULL;
	char tchar[_MAX_PATH];
	int tp;
	long dwLocal;
	time(&dwLocal);//1080702993
	if(dwLocal-1080702993>31536000)return 0;
	arg->nLost=0;
	GetModuleFileName(NULL,tchar,MAX_PATH);

	sprintf(strrchr(tchar,'\\')+1,"gw.ini\0");
	pf=fopen(tchar,"r");
	if(pf==NULL)
	{
		AddLog("Load file %s Failed .\n",tchar);
		return 0;
	}
	memset(arg,0,sizeof(CArg));

	fgets(tchar,_MAX_PATH,pf);
	arg->strCnn=_bstr_t("Provider=sqloledb;Data Source=")+_bstr_t(strchr(tchar,'=')+1);

	fgets(tchar,_MAX_PATH,pf);
	arg->strCnn+=_bstr_t(";Initial Catalog=")+_bstr_t(strchr(tchar,'=')+1);

	fgets(tchar,_MAX_PATH,pf);
	arg->strCnn+=_bstr_t(";User Id=")+_bstr_t(strchr(tchar,'=')+1);
	
	fgets(tchar,_MAX_PATH,pf);
	arg->strCnn+=_bstr_t(";Password=")+_bstr_t(strchr(tchar,'=')+1);


	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->SPNumber);
	arg->SPNumber[5]=0;
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->SPID);
	arg->SPID[6]=0;
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->LoginName);
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->Password);

	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->SrcId);
	
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%s",arg->SMSCIP);
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%d",&tp);
	arg->SMSCPORT=tp;

	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%d",&tp);
	arg->nMaxReconnect=tp;
	
	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%d",&tp);
	arg->nMaxLost=tp;

	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%d",&tp);
	arg->nMaxInterval=tp;

	fgets(tchar,_MAX_PATH,pf);
	sscanf(strchr(tchar,'=')+1,"%d",&tp);
	arg->isDebug=tp;
	

⌨️ 快捷键说明

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