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

📄 func.cpp

📁 本程序是实现中国移动中国联通的网关程序.代码比较完整.
💻 CPP
字号:
#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 "ini.h"

char *MonListName[31];
int MonListTime[31]={0};

CArg arg;


void read_config()
{
	char *getstr;
	//int tp;
	char str1[_MAX_PATH];
	GetModuleFileName(NULL,str1,MAX_PATH);
	sprintf(strrchr(str1,'\\')+1,"main.ini\0");
	CIni Ini(str1);

     arg.isMO=Ini.ReadInt("Monitor","MonCount");
	 //sscanf(getstr,"%d",&tp);//监控通道的数量
	 //arg.isMO=tp;
	 if (arg.isMO>30 || arg.isMO<1)
	 {
		 arg.isMO=0;
		 arg.isStop=0x02;
		 AddLog("通道监测的服务太多超过30\n");
		 return;
	 }
//AddLog("初始化成功MonCount is %d \n",arg.isMO);
	 for (int i=0; i<arg.isMO;i++)
	 {
		memset(str1,0,sizeof(str1));
		sprintf(str1,"Service%d\0",i);
		getstr=Ini.ReadText("Monitor",str1);
		MonListName[i]=getstr;
		sprintf(MonListName[i],"%s\0",getstr);
//AddLog("监控列表服务|%d| is %s \n",i+1,MonListName[i]);
		sprintf(str1,"net start \"%s\"\0",MonListName[i]);
//AddLog("服务%d名称 启动命令 %s \n",i,str1);
		BeginService(str1);
	 }
	 Ini.Close();
//AddLog("初始化成功.\n\n");
	 return;

}
void read_config_times()
{
	char *getstr;
	char str1[_MAX_PATH];
	int tp;

//AddLog("服务文件名|%s|\n",arg.szFile);
	CIni Ini(arg.szFile);

	for (int i=0; i<arg.isMO;i++)
	{
		memset(str1,0,sizeof(str1));
			//取得所监控服务写入的时间串
		sprintf(str1,"%s",MonListName[i]);
			//AddLog("读文件|%s|\n",str1);
		getstr=new char[256];
		getstr=Ini.ReadText("MonTimes",str1);
			//如果时间串不存在则置为1000
		if (strlen(getstr)<8) getstr="1000";
		sscanf(getstr,"%d",&tp);
		MonListTime[i]=tp;
		//AddLog("服务名称%s,当前时间:%d\n",MonListName[i],MonListTime[i]);
	}
	Ini.Close();
	return;
	
}
void BeginService(char *str)
{
WinExec(str,SW_HIDE);
AddLog("%s\n",str);
return;
}


GW_API DWORD BeginGW(LPVOID pp)
{
	DWORD dwRet;
	HANDLE h[2];
//	WSAData wsaData;
//WSAStartup(0x202,&wsaData);
	//WinExec("net start \"gwsd_unicomMO sub\"",SW_HIDE);
	if(!GetArg(&arg))
	{
		AddLog("读取配置文件错误!!\n");
		SleepEx(1000*10,1);
		return  1;
	}
//AddLog("读取配置文件成功!!\n");
	//读取所监控的服务并启动服务
	read_config();
AddLog("读取服务列表并启动成功!!开始监控!!\n");

    arg.isStop=0;
	dwRet=0; 
	ResetEvent(arg.hGW);
	h[0]=arg.hGW;
	h[1]=(HANDLE)_beginthreadex(NULL,0,(unsigned int(__stdcall*)(void*))MOThread,0,0,0);

	while(!arg.isStop)
	{
		dwRet=WaitForMultipleObjects(2,h,FALSE,20*1000);
		switch(dwRet)
		{
			case WAIT_FAILED:	//error:
				AddLog("WSAWaitFor Error\n");
				return 0;
				break;
			case WAIT_TIMEOUT:
				WriteMonitorTime(arg.szSub);//写入监控时间
				break;
			case WAIT_OBJECT_0:	//EventForExit
				AddLog("Get msg to stop GW.\n");
				goto RETURN_001;
				break;
			case WAIT_OBJECT_0 +1://mo thread exit here.
				GetExitCodeThread(h[1],&dwRet);
				if(arg.isDebug)AddLog("MOThread exit for %d.\n",dwRet);
				goto RETURN_001;
				break;
		}//end switch

	}//end fo while (1)

RETURN_001:
	arg.isStop=0x7e;
	
	AddLog("exit BeginGW\n");
	SleepEx(1000,1);

#if ONESECTION1
	DeleteCriticalSection(&(arg.syc1));
#endif
#if ONESECTION2
	DeleteCriticalSection(&(arg.syc2));
#endif
#if ONESECTION3
	DeleteCriticalSection(&(arg.syc3));
#endif
	return 0;
}
//监控程序
DWORD WINAPI MOThread(LPVOID pp)
{
	char getstr[256];
	int newtime;
	//int iCount=0;

AddLog("进入监控程序MOThread;\n");
SleepEx(arg.iSelectInterval,1);
	while(!arg.isStop)
	{
	
		if (arg.isDebug >1) AddLog("Service Sleep %d秒\n",arg.iSelectInterval/1000);
	for ( int j=0;j<10;j++)
	{
		if (arg.isStop) return 0;
		SleepEx(arg.iSelectInterval/10,1);
	}
	//if (iCount>1) continue; 
		//取得所有通道的时间串
read_config_times();
newtime=GetTime();
//AddLog("取得的服务数为%d\n",arg.isMO);

		for (int i=0;i<arg.isMO;i++)
		{
			if (MonListTime[i]==1000) 
			{
				AddLog("Error: \"%s\" NO in Monitor!!\n ",MonListName[i]);
				WriteMonitorTime(MonListName[i]);//写入监控时间
				continue;
			}
//AddLog("时间比较结果%d秒,监控间隔时间%d\n",(newtime-MonListTime[i]),arg.iChannelNum);
			if ((newtime-MonListTime[i])>arg.iChannelNum)
			{
			 AddLog("时间比较结果%d秒,监控间隔时间%d秒\n",
					(newtime-MonListTime[i]),arg.iChannelNum);
			    SleepEx(5000,1);
				sprintf(getstr,"net stop \"%s\"\0",MonListName[i]);
				BeginService(getstr);
				SleepEx(5000,1);
				sprintf(getstr,"net start \"%s\"\0",MonListName[i]);
				BeginService(getstr);
				SleepEx(5000,1);

			} //end if
		
		}//end for

	}//end fo while (1)

	return 0;
}

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;
}


bool GetArg(CArg* arg)
{
	FILE* pf=NULL;
	char tchar[_MAX_PATH];
	char *getstr;
	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,"main.ini\0");

	memset(arg,0,sizeof(CArg));
	 
	CIni Ini(tchar);
	//AddLog("配置文件路径%s\n",tchar);
     getstr=Ini.ReadText("BaseInfo","Mtime");
	 sscanf(getstr,"%d",&tp);
	 if (tp>30 || tp<2) tp=3;
	arg->iChannelNum=tp*60;//取得秒数
	arg->iSelectInterval=tp*60*1000/3;//取得Sleep毫秒数

	getstr=Ini.ReadText("BaseInfo","Debug");
	sscanf(getstr,"%d",&tp);
	arg->isDebug=tp;
//AddLog("配置文件路径%d\n",arg->isDebug);
	GetModuleFileName(NULL,arg->szFile,MAX_PATH);
	getstr=Ini.ReadText("BaseInfo","FileMonitor");
	if (strlen(getstr)>1)
		sprintf(strrchr(arg->szFile,'\\')+1,"%s\0",getstr);
   
	Ini.Close();//Close 文件

//取得服务名称
	GetModuleFileName(NULL,tchar,MAX_PATH);
	sprintf(strrchr(tchar,'\\')+1,"servicename.ini\0");
	pf=fopen(tchar,"r");
	if(pf==NULL)
	{
		AddLog("Load file %s Failed .\n",tchar);
		return 0;
	}
	fgets(arg->szSub,_MAX_PATH,pf);
	while(arg->szSub[strlen(arg->szSub)-1]<32)
		arg->szSub[strlen(arg->szSub)-1]=0;
	fclose(pf);	
	



	arg->hGW=CreateEvent(NULL,TRUE,FALSE,NULL);
	if(arg->hGW==NULL)return 0;
	arg->isActive=0;
	arg->dwRecv=arg->dwSend=0;
	arg->dwSequence=0;

#if ONESECTION1
	InitializeCriticalSection(&(arg->syc1));
#endif

#if ONESECTION2
	InitializeCriticalSection(&(arg->syc2));
#endif
#if ONESECTION3
	InitializeCriticalSection(&(arg->syc3));
#endif
	return 1;
}

GW_API void StopGW()
{
//	if(arg.ms>0)closesocket(arg.ms);
//	if(arg.s>0)closesocket(arg.s);
//	WSACleanup();
	arg.isStop=0x02;
	AddLog("Send msg to stop GW.\n");
	if(arg.hGW!=NULL)SetEvent(arg.hGW);
}
void AddBinLog(char* buffer,int i,int flag)
{
	int j=0;
	FILE* pfLog;
	char current[36];
	char tp[36];
	struct _timeb timebuffer;
	char lpFileName[MAX_PATH];
	if(arg.isDebug<2)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>\n",
		tp,timebuffer.millitm,flag);
	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(isprint(buffer[j-15+k]))
			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(isprint(buffer[i-j+k]))
		fwrite(buffer+i-j+k,1,1,pfLog);
		else fprintf(pfLog,".");
	}
	fprintf(pfLog,"\n");
	fflush(pfLog);
	fclose(pfLog);
}

void AddResp(char* filename,BYTE isHour,const char* format,...)
{
	FILE* pfLog;
	char current[36];
	char tp[36];
	struct _timeb timebuffer;
	char lpFileName[MAX_PATH];
	_strdate(current);
	_ftime(&timebuffer);
	strcpy(tp,ctime(&(timebuffer.time)));
	current[2]=current[3];
	current[3]=current[4];
	current[4]=0;
	tp[strlen(tp)-1]=0;
	strcpy(tp,strchr(tp,' ')+1);
	strcpy(tp,strchr(tp,' ')+1);
	strcpy(tp,strchr(tp,' ')+1);
	GetModuleFileName(NULL,lpFileName,MAX_PATH);
	if(isHour!=0)
	sprintf(strrchr(lpFileName,'\\')+1,
	"%s%s%s%.2s.txt\0",filename,strrchr(tp,' ')+1,current,tp);//create file in each hour
	else
	sprintf(strrchr(lpFileName,'\\')+1,
	"%s%s%s.txt\0",filename,strrchr(tp,' ')+1,current);//create file in each day
	pfLog=fopen(lpFileName,"a");
	if(pfLog==NULL)return ;
	va_list args;
	va_start(args,format);
#if _DEBUG
	vfprintf(stdout,format,args);
#endif
	vfprintf(pfLog,format,args);
	va_end(args);
	fflush(pfLog);
	fclose(pfLog);
}


CArg::~CArg()
{

}

void WriteMonitorTime(char *szSubName)
{
	int iTime;
	char sTime[11]={0};

	try { //Start try

	iTime=GetTime();
	sprintf(sTime,"%ld",iTime);

//AddLog("文件监控路径%s\n",arg.szFile);
	CIni Ini(arg.szFile);

	if (!Ini.Write("MonTimes",szSubName,sTime)) 
	{
		AddLog("写监控文件出错,服务名称:%s,时间:%s\n",arg.szSub,sTime);
	}
	
	Ini.Save();
	Ini.Close();
	}//End try 
	catch(...)
	{
	}
	return;
}

⌨️ 快捷键说明

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