?? procguard.cpp.bak
字號(hào):
#include "ProcGuard.h"
/*
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <linux/fs.h>
#include <sys/stat.h>
typedef struct _ihdr
{
unsigned short int i_type, i_code;
unsigned short int i_cksum,i_id, i_seq;
}IcmpHeader;
struct sockaddr_in saDestAddr;
string Messtr,Tmpstr;
unsigned short int checksum(unsigned short int *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(unsigned short int);
}
if(size )
{
cksum += *(unsigned char*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (unsigned short int)(cksum);
}
bool Autotest(unsigned char * szDestHost,int Ktest)
{
// WSADATA wsaData;
int sockRaw;
struct sockaddr_in dest,from;
char icmp_data[10], recvbuf[100];
unsigned int addr=0;
int fromlen = sizeof(from);
int timeout = 1000; //ms
// WSAStartup(MAKEWORD(2,1),&wsaData) ;
sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP);
setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,
(char*)&timeout,sizeof(timeout) );
memset(&dest,0,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.s_addr= inet_addr(szDestHost);
memset(icmp_data,0,sizeof(icmp_data)); //clear icmp_data.
((IcmpHeader*)icmp_data)->i_type = 8; //ICMP_ECHO
((IcmpHeader*)icmp_data)->i_code = 0;
((IcmpHeader*)icmp_data)->i_id = (unsigned short int)GetCurrentProcessId();
((IcmpHeader*)icmp_data)->i_seq = 0;
for(int k=0; k
{
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->i_seq ++;
((IcmpHeader*)icmp_data)->i_cksum=checksum((unsigned short int*)icmp_data,8);
sendto(sockRaw,icmp_data,8,0,(struct sockaddr*)&dest,sizeof(dest));
int bread=recvfrom(sockRaw,recvbuf,1024,0,(struct sockaddr*)&from,
&fromlen);
if (bread == SOCKET_ERROR)
{
if(k==Ktest-1) goto ERR1 ;
else continue; //try again(3 times)
}
}
return TRUE; //no erros.
ERR1:
closesocket (sockRaw);
sockRaw= INVALID_SOCKET;
// WSACleanup();
return FALSE;
}
*/
//---------------------------------------------------------------------------
int LinkTest(char *szLinkString,int iCount)
{
char szCmd[256];
FILE *fp;
char acTemp[1024];
int i,iPingSuccess=0;
if(iCount<1 || iCount > 10)
{
return -1;
}
sprintf(szCmd,"ping -c ");
sprintf(szCmd+8,"%d ",iCount);
strcat(szCmd,szLinkString);
strcat(szCmd," >/tmp/.ping.txt");
printf("szCmd=%s,Count=%d\n",szCmd,iCount);
system(szCmd);
usleep(iCount*1000);//waiting for ping exec
fp=fopen("/tmp/.ping.txt","rt");
if(fp==NULL)
{
return -1;
}
fgets(acTemp,1024,fp);
for(i=0;i<iCount;i++);
{
fgets(acTemp,1024,fp);
printf("acTemp=%s\n",acTemp);
if(strstr(acTemp,"time="))
{
iPingSuccess++;
}
}
fclose(fp);
return iPingSuccess;
}
string getFileName(string str)
{
int len = str.length();
int pos = str.rfind('/',len -1);
string tstr;
if( pos >= 0 )
{
pos ++;
while( str[pos] != '\0' )
tstr+=str[pos++];
}
else
tstr = str;
return tstr;
}
string getFilePath(string str)
{
int len = str.length();
int pos = str.rfind('/',len -1);
string tstr;
if( pos >= 0 )
{
str[pos] = '\0';
tstr = str;
}
else
tstr = "./";
return tstr;
}
CProcGuard::CProcGuard()
{
printf("CProcGuard:begin load cfg file\n");
m_strTmpfName = "./tmp.tmp";
if( loadConfig() == false )
exit(0);
}
bool CProcGuard::loadConfig()
{
printf("Load procGuard configre file\n");
CIniFile cfgFile;
if( cfgFile.Open(CFGFILE) )
{
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("DELAY");
cfgFile.ReadInt(m_nDelaytm);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("PROCNUM");
cfgFile.ReadInt(m_nProcess);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTYPE");
cfgFile.ReadString(m_strLinkType);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTEST1");
cfgFile.ReadString(m_strLinkTest1);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTEST2");
cfgFile.ReadString(m_strLinkTest2);
//printf("m_strLinkTest1 = %s\n",m_strLinkTest1);
//printf("m_strLinkTest2 = %s\n",m_strLinkTest2);
for(int i=0;i<m_nProcess;i++)
{
string strProc;
cfgFile.LocateHeading("PROCESS");
char szKey[8]={0};
sprintf(szKey,"PROC%d",i+1);
cfgFile.LocateKey(szKey);
cfgFile.ReadString(strProc);
//. this->AddProc(strProc);
}
cfgFile.Close();
}
else
{
printf("Configure file loaded failed!\n");
return false;
}
return true;
}
bool CProcGuard::AddProc(string str)
{
tagProcInfo *pProc = new tagProcInfo;
if( pProc == NULL )
return false;
pProc->strNam = getFileName(str);
pProc->strPath = getFilePath(str);
pProc->bRuning = false;
// m_lstProc.push_back(pProc);
m_arrProc.push_back(pProc);
return true;
}
bool CProcGuard::IsProcRuning(tagProcInfo *pProc)
{
#ifdef _WIN32
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //獲得某一時(shí)刻系統(tǒng)的進(jìn)程的快照信息
PROCESSENTRY32 procInfo;
procInfo.dwSize=sizeof(PROCESSENTRY32);
BOOL bMore = Process32First(hSnapshot,&procInfo); //獲得系統(tǒng)進(jìn)程鏈表中第一個(gè)進(jìn)程的信息
for(int i=0;bMore;i++)
{
char procNam[128];
memcpy(procNam,procInfo.szExeFile,sizeof(procInfo.szExeFile));
if( strcmp(procNam,pProc->strNam) == 0 )
return true;
//獲得下一進(jìn)程
bMore=Process32Next(hSnapshot,&procInfo);
}
return false;
#else
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd,"ps -ef | grep ");
sprintf(szCmd+14,"%s | awk '{print $8}' > ",pProc->strNam.c_str());
sprintf(szCmd+14+pProc->strNam.length()+22,"%s ",m_strTmpfName.c_str());
system(szCmd);
FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
if( fp == NULL )
{
cout<<"."<<endl;
return true; // 算本次運(yùn)行失敗,運(yùn)行下次運(yùn)行.
}
char par[128] ={0};
while ( fgets(par,128,fp) )
{
string tstr = par;
tstr = getFileName(tstr);
if( tstr == pProc->strNam )
{
fclose(fp);
return true;
}
}
fclose(fp);
return false;
#endif
/* // 生產(chǎn) 系統(tǒng)調(diào)用命令字符串
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd+0,"C:/tlist -p ");
getFileName(str);
sprintf(szCmd+12,"%s",str.c_str(),str.length());
sprintf(szCmd+12+str.length()," > %s ",m_strTmpfName.c_str());
//如: "C:/tlist -p E:/telnet/QQ.exe > C:/tmp.tmp"
// 檢查 進(jìn)程是否運(yùn)行,并寫文件
if( system(szCmd) != 0 )
{
cout<<"system call failed! Anykey exit."<<endl;
getchar();
exit(-1);
}
// 讀取 生成的文件,查看進(jìn)程狀態(tài)
Sleep(1000);
FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
if( fp == NULL )
{
cout<<"."<<endl;
return true; // 算本次運(yùn)行失敗,運(yùn)行下次運(yùn)行.
}
char par[8] ={0};
fgets(par,8,fp);
fclose(fp);
if(par[0] == '-')
return false;
else
return true;
*/
}
bool CProcGuard::StartupProc(tagProcInfo *pProc)
{
// 形成命令
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd,"%s/%s ",pProc->strPath.c_str(),pProc->strNam.c_str());
#ifdef _WIN32
int ret = WinExec(szCmd,SW_SHOW);
if( ret < 31 )
{
cout<<str<<" startup failed"<<endl;
return false;
}
return true;
#else
// 執(zhí)行命令
int ret = system(szCmd);
if( ret >= 0 )
return true;
else
return false;
#endif
}
void CProcGuard::Run()
{
printf("begin run...\n");
int x=0;
x=LinkTest(m_strLinkTest1,4);
printf("linktest %d\n",x);
x=LinkTest(m_strLinkTest2,4);
printf("linktest %d\n",x);
while( 1 )
{
#ifdef _WIN32
Sleep(m_nDelaytm*1000);
#else
sleep(m_nDelaytm);
#endif
//printf("run....\n");
for(int i=0;i<m_arrProc.size();i++)
{
tagProcInfo *pProc = (tagProcInfo *)m_arrProc[i];
if( IsProcRuning(pProc) == false )
{
if( StartupProc(pProc) == true )
pProc->bRuning = true;
}
}
}
}
CProcGuard::~CProcGuard()
{
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd+0,"del ");
sprintf(szCmd+4,"%s",m_strTmpfName.c_str());
if( system(szCmd) != 0 )
cout<<"tmp file delete failed"<<endl;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -