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

📄 func.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include <windows.h>
#include <process.h>
#include <time.h>
#include <sys/timeb.h>
#include <stdio.h>
#include <winsock2.h>
#include <direct.h>
#include <stdarg.h>
#include <wchar.h>
#include <STDLIB.H>
#include "gw.h"
#include "func.h"
#include "sock.h"
CArg arg;
DWORD WINAPI MOThread(LPVOID pp)
{
	struct sockaddr_in fsin;
	char buffer[SMPPMAXLENGTH];
	char strSQL[512];
	fd_set rfds,afds;
	int alen;
	DWORD fdindex;
	timeval tv;
	DWORD ret=0;
	CMSG msg;
	while(arg.isMO<1)SleepEx(10000,1);

	tv.tv_sec=10;
	tv.tv_usec=0;

	alen=0;
	arg.ms=passiveTCP(arg.szService,5);
	FD_ZERO(&afds);
	FD_SET(arg.ms,&afds);
	if(arg.ms<1||arg.ms==-1)
	{
		SleepEx(10000,0);
		return ExitFromNetClose;
	}



	if(arg.isDebug)AddLog("begin to get mo\n");
	while(1)
	{
		if(arg.isStop)return 0;
		memcpy(&rfds,&afds,sizeof(afds));
		fdindex=select(FD_SETSIZE,&rfds,(fd_set*)0,(fd_set*)0,
			(struct timeval*)&tv);
		arg.dwRecv++;
		if(fdindex==SOCKET_ERROR)//network error
		{
			AddLog("select error for %d\n",GetLastError());
			SleepEx(20*1000,1);
			goto cleanupmo;
		}
		else if(fdindex==0)
		{
			continue;//time expired
		}
		//data is coming.
		if(FD_ISSET(arg.ms,&rfds))
		{
			SOCKET ssock;
			alen=sizeof(fsin);
			ssock=accept(arg.ms,(struct sockaddr*)&fsin,&alen);
			if(ssock==INVALID_SOCKET)
			{
				AddLog("accept error for %d\n",GetLastError());
				goto cleanupmo;
			}
			else if(ssock==0)goto cleanupmo;

			FD_SET(ssock,&afds);
			if(arg.isDebug)
			AddLog("server %d.%d.%d.%d socket is connected.\n",
			(BYTE)fsin.sin_addr.S_un.S_un_b.s_b1,
			(BYTE)fsin.sin_addr.S_un.S_un_b.s_b2,
			(BYTE)fsin.sin_addr.S_un.S_un_b.s_b3,
			(BYTE)fsin.sin_addr.S_un.S_un_b.s_b4);
		}//if isset msock
		for(fdindex=0;fdindex<rfds.fd_count;fdindex++)
		{
			SOCKET fd=rfds.fd_array[fdindex];
			if(fd!=arg.ms&&FD_ISSET(fd,&rfds))//process the next package.
			{
				int i,j;
				i=j=0;
				if(RecvBuffer(fd,buffer))
				{					
					if(arg.isDebug)
						AddLog("server socket is closed.\n");
					closesocket(fd);
					FD_CLR(fd,&afds);
					continue;//continue to process the next socket
				}//end of if 
//now , the package should be processed.
				memset(&msg,0,sizeof(CMSG));
				msg.dwCommand=(GetNByte(buffer+4,4)+0x80000000);
				msg.dwSequence=GetNByte(buffer+8,4);
				msg.dwSequence2=GetNByte(buffer+12,4);
				msg.dwSequence3=GetNByte(buffer+16,4);
				msg.dwResult=0;

				try
				{
				switch(GetNByte(buffer+4,4))
				{
				case SGIP_BIND:
					if(arg.isDebug)
						AddLog("Server is binding.\n");
					i=InitMsg(buffer,&msg);//bind ok
					if(send(fd,buffer,i,0)<i)closesocket(fd);
					break;
				case SGIP_DELIVER:
					strncpy(msg.SrcTermId,buffer+20+2,21);
					strncpy(msg.DstTermId,buffer+41,21);
					msg.msg_format=buffer[64];
					msg.msg_len=GetNByte(buffer+65,4);
					for(i=0;i<msg.msg_len;i++)
						sprintf(msg.szContent+i*2,"%.2x",
						(BYTE)(buffer[69+i]));
					msg.msg_len*=2;
					//ismg_id,src,msg,msg_format,dst,channel,linkid
					sprintf(strSQL,"exec sp_insert_mo '%.10d%d','%s',0x%s,%d,'%s',%d,'%s'",
						GetNByte(buffer+12,4),//id_time
						GetNByte(buffer+16,4),//id_sn
						msg.SrcTermId,//src_termid
						msg.szContent,//msg
						msg.msg_format,//msg_format
						msg.DstTermId,//dst_termid
						arg.iChannelNum,//channel number.
						buffer+GetNByte(buffer,4)-8//LinkID
						);
					AddResp("MO",0,"%.10d%d,%s,0x%s,%d,%s,%d,%s\n",
						GetNByte(buffer+12,4),//id_time
						GetNByte(buffer+16,4),//id_sn
						msg.SrcTermId,//src_termid
						msg.szContent,//msg
						msg.msg_format,//msg_format
						msg.DstTermId,//dst_termid
						arg.iChannelNum,//channel number.
						buffer+GetNByte(buffer,4)-8//LinkID
						);
					if(arg.isDebug)AddLog("%s\n",strSQL);
					i=InitMsg(buffer,&msg);
					if(send(fd,buffer,i,0)<i)closesocket(fd);
					arg.pCnnGSM->Errors->Clear();
					arg.pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);
				break;
				case SGIP_UNBIND:
					i=InitMsg(buffer,&msg);
					send(fd,buffer,i,0);
					closesocket(fd);
					if(arg.isDebug)
						AddLog("%d unbind.\n",fd);
					FD_CLR(fd,&afds);
				break;
				case SGIP_REPORT:
						if((BYTE)buffer[32]==0)
						{
							sprintf(strSQL,"EXEC SP_STATE_REPORT %d,'%.10d%d','%.21s','%d','%d'",
								arg.iChannelNum,
								GetNByte(buffer+24,4),//id2
								GetNByte(buffer+28,4),//id3
								buffer+35,//dst_termid,skim 86
								buffer[54],//state
								buffer[55]//error code where state=2,else error=0
								);

							if(arg.isDebug)AddLog("report <%s>.\n",strSQL);
							arg.pCnnGSM->Errors->Clear();
							arg.pCnnGSM->Execute((char*)strSQL,NULL,adExecuteNoRecords);

							AddResp("Status",0,"%d,%.10d%d,%.21s,%d,%d\n",
								arg.iChannelNum,
								GetNByte(buffer+24,4),//id2
								GetNByte(buffer+28,4),//id3
								buffer+35,//dst_termid,skim 86
								buffer[54],//state
								buffer[55]//error code where state=2,else error=0
								);
							msg.dwResult=0;
						}else msg.dwResult=1;
						arg.isActive=2;
						ret=InitMsg(buffer,&msg);//result=0 means right. else error.
#if ONESECTION1
						EnterCriticalSection(&(arg.syc1));
#endif
						send(arg.s,buffer,ret,0);
#if ONESECTION1
						LeaveCriticalSection(&(arg.syc1));
#endif
					break;
				}//end of swtich
//end of processing a package.
				}//try
				catch (_com_error &e)
				{
					AddLog("Process msg error.\n<%s>\n",strSQL);			
					AddLog("Description = '%s'\n", (char*) e.Description());
					goto cleanupmo;
				}
				//end of to process the msg package.

			}//end of isset
		}//end of for 

	}
cleanupmo:
	return 0;
}
GW_API DWORD BeginGW(LPVOID pp)
{
	WSAData wsaData;
	DWORD dwRet;
	HANDLE h[3];
	DWORD dwRecv,dwSend;
	WSAStartup(0x202,&wsaData);

	if(!GetArg(&arg))
	{
		SleepEx(1000*10,1);
		return  1;
	}

	if(arg.isDebug)AddLog("GW.dll is beginning.\n\n");
	dwRet=0;
	ResetEvent(arg.hGW);
	h[0]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))MTThread,0,0,0);
	h[1]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))MOThread,0,0,0);
	h[2]=arg.hGW;
	dwRecv=dwSend=0;
	while(1)
	{
		dwRet=WaitForMultipleObjects(3,h,FALSE,20*1000);
		switch(dwRet)
		{
			case WAIT_FAILED:	//error:
				AddLog("WSAWaitFor Error\n");
				return 0;
				break;
			case WAIT_TIMEOUT:
				SendCheck(arg.szSub);
				AddLog("seq: <%d-%d>(%d-%d)\n",dwSend,arg.dwSend,dwRecv,arg.dwRecv);
				if((dwRecv>arg.dwRecv&&arg.isMO)||(dwSend>arg.dwSend&&arg.isMO%2==0))
				{
					arg.isStop=2;
					if(arg.isDebug)
						AddLog("No data, thread will rerun.\n");
						dwRecv=arg.dwRecv;
						dwSend=arg.dwSend;
						//TerminateThread(h[0],0);
						//TerminateThread(h[1],0);						
						goto RET_003;
				}
				dwRecv++;dwSend++;
				if(dwRecv<arg.dwRecv)dwRecv=arg.dwRecv;
				if(dwSend<arg.dwSend)dwSend=arg.dwSend;
				break;
			case WAIT_OBJECT_0:	//mt_thread exit here
				GetExitCodeThread(h[0],&dwRet);
				if(arg.isDebug)AddLog("mt_thread exit.\n");
				if(dwRet==ExitFromNetClose||dwRet==0)
				{
					//TerminateThread(h[1],0);
					goto RET_003;
				}
				CloseHandle(h[0]);
				h[0]=(HANDLE)_beginthreadex(NULL,0,
					(unsigned int(__stdcall*)(void*))MTThread,0,0,0);
				if(h[0]==NULL)
				{
					//TerminateThread(h[1],0);
					goto RET_003;
				}
				break;
			case WAIT_OBJECT_0 +1://mo thread exit here.
				GetExitCodeThread(h[1],&dwRet);
				if(arg.isDebug)AddLog("MOThread exit for %d.\n",dwRet);
				if(dwRet==ExitFromNetClose||dwRet==0)
				{
					//TerminateThread(h[0],0);
					goto RET_003;
				}
				CloseHandle(h[1]);
				h[1]=(HANDLE)_beginthreadex(NULL,0,
					(unsigned int(__stdcall*)(void*))MOThread,
					0,0,0);
				if(h[1]==NULL)
				{
					//TerminateThread(h[0],0);
					goto RET_003;
				}
				break;
			case WAIT_OBJECT_0+2:	//EventForExit
				AddLog("Get msg to stop GW.\n");
				goto RET_003;
				break;
		}//switch(dwRet)
	}//end fo while (1)
RET_003:
	arg.isStop=0x7e;
	//SleepEx(1000,1);
	WSACleanup();
	AddLog("exit BeginGW\n");
	if(arg.pCnnGSM->GetState())arg.pCnnGSM->Close();
	//::CoUninitialize();
#if ONESECTION1
	DeleteCriticalSection(&(arg.syc1));
#endif
#if ONESECTION2
	DeleteCriticalSection(&(arg.syc2));
#endif
#if ONESECTION3
	DeleteCriticalSection(&(arg.syc3));
#endif
	return 0;
}
void PutByteString(char* dest,
				   char* source,
				   int length)
{
	int i=0;
	if(source==NULL)return;
	for(i=0;i<length;i++)
		dest[i]=source[i];
}
void PutNByte(char* buffer,BYTE b,DWORD in)
{
        int i; 
		if(b>4)b=4;
        for(i=0;i<b;i++) 
        { 
            *(buffer+b-1-i)=char(in&0xFF);
			in>>=8;
        } 
}
DWORD GetTime()
{
	char date[20],time[20];
	int ret=0;
	_strdate(date);
	_strtime(time);
	date[2]=date[3];
	date[3]=date[4];
	memcpy(date+4,time,2);
	memcpy(date+6,time+3,2);
	memcpy(date+8,time+6,2);
	date[10]=0;
	ret=atoi(date);
	return ret;
}
DWORD GetTimeMillSec()
{
	int ret=0;
	struct _timeb timebuffer;
	_ftime(&timebuffer);
	ret=timebuffer.millitm+timebuffer.time%3600*1000;
	return ret;
}

void GetTime(char* buffer,int period)
{
	char date[20],time[20];
	int d,h,m;
	int year,month;
	_strdate(date);
	_strtime(time);
	m=atoi(time+3)+period;
	h=m/60+atoi(time);m%=60;
	d=h/24+atoi(date+3);h%=24;
	month=atoi(date);
	year=atoi(date+6);
	switch(month){
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		if(d>31){month+=d/31;d%=31;}
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		if(d>30){month+=d/30;d%=30;}
		break;
	case 2:
		if((year%4==0&&year%100>0)||year%400==0){
			if(d>29){month+=d/29;d%=29;}
		}else 
		{
			if(d>28){month+=d/28;d%=28;}
		}
	}
	if(month>12){year+=month/12;month%=12;}
	sprintf(buffer,"%.2d%.2d%.2d%.2d%.2d%.2d",
		year,month,d,h,m,atoi(time+6));
	strcpy(buffer+12,"032+");
}

DWORD GetNByte(char* buffer,BYTE b)
{
    int i; 
    DWORD rt=0; 
	if(b>4)b=4;
    for(i=0;i<b;i++) 
            rt=rt*256+*(unsigned char*)(buffer+i); 
    return rt; 
}
long Jstrncpy(char* dest,
					   const char* source,
					   long size)
{
	UINT i=0;
	memset(dest,0,size);
	if(source==NULL)return 0;
	if((long)strlen(source)>=size)
		strncpy(dest,source,size);
	else
		strcpy(dest,source);
	return (long)strlen(dest);
}
int InitMsg(char* buffer,CMSG* msg)
{
	int i,j,k;
	unsigned __int16 tp;
	char tmp[50];
	BYTE b;
	memset(buffer,0,SMPPMAXLENGTH);
	tp=j=k=i=0;
	i+=4;
	PutNByte(buffer+i,4,msg->dwCommand);

⌨️ 快捷键说明

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