📄 func.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 + -