📄 appip.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <Config.h>
#include <Utility.h>
#include "Consts.h"
#include "Db.h"
#include "AppIp.h"
#include "Basic.h"
//#define TRACEFILE 1
//#define FROMFILE 1
#define DEBUG 1
#define USEDBCFG 1
//read config information from db
int CAppIp::initIpCfgDB()
{
CTblWebApp tblweb;
STRU_TR_T_WEBMONRULE recrule;
STRU_TR_T_SUBMITRULE recsubmitrule;
m_totipcfg=0;
m_totipcfg=tblweb.totCount_TR_T_WEBMONRULE();
if( m_totipcfg<=0)
return m_totipcfg;
m_pipcfgdb=new StIpCfgDB[m_totipcfg];
int iii;
for(iii=0;iii<m_totipcfg;iii++)
{
tblweb.fetchRecord(&(recrule));
TU::delSpace(recrule.WMR_URLFEATURE);
TU::delSpace(recrule.WMR_HOST);
printf("[%s][%s]\n",recrule.WMR_HOST,recrule.WMR_URLFEATURE);
TLog::toErr("[%s][%s]\n",recrule.WMR_HOST,recrule.WMR_URLFEATURE);
strcpy((m_pipcfgdb+iii)->szurl,recrule.WMR_URLFEATURE);
strcpy((m_pipcfgdb+iii)->szhost,recrule.WMR_HOST);
(m_pipcfgdb+iii)->wapid=recrule.WAP_ID;
(m_pipcfgdb+iii)->wmrid=recrule.WMR_ID;
}
tblweb.closeCur();
for( iii=0;iii<m_totipcfg;iii++)
{
int inums=tblweb.totCount_TR_T_SUBMITRULE((m_pipcfgdb+iii)->wmrid);
(m_pipcfgdb+iii)->inumdomain=inums;
(m_pipcfgdb+iii)->szdomain= new char[64*inums];
(m_pipcfgdb+iii)->szdomain_app= new char[64*inums];
int id=(m_pipcfgdb+iii)->wmrid;
for(int j=0;j<inums;j++)
{
tblweb.fetchRecord(&recsubmitrule,id);
TU::delSpace(recsubmitrule.SBR_SUBMITFIELD);
TU::delSpace(recsubmitrule.SBR_APPFIELD);
strcpy((m_pipcfgdb+iii)->szdomain+64*j,recsubmitrule.SBR_SUBMITFIELD);
strcpy((m_pipcfgdb+iii)->szdomain_app+64*j,recsubmitrule.SBR_APPFIELD);
printf("[%s][%s]\n",(m_pipcfgdb+iii)->szdomain+64*j,(m_pipcfgdb+iii)->szdomain_app+64*j);
TLog::toErr("[%s][%s]\n",(m_pipcfgdb+iii)->szdomain+64*j,(m_pipcfgdb+iii)->szdomain_app+64*j);
}
tblweb.closeCur();
}
for(int ii=0;ii<m_totipcfg ;ii++)
{
printf("url=[%s] ,host=[%s],wapid=[%d] wmrid=[%d] inumdomain=[%d]",
(m_pipcfgdb+ii)->szurl,(m_pipcfgdb+ii)->szhost,
(m_pipcfgdb+ii)->wapid,
(m_pipcfgdb+ii)->wmrid,
(m_pipcfgdb+ii)->inumdomain);
TLog::toErr("url=[%s] ,host=[%s],wapid=[%d] wmrid=[%d] inumdomain=[%d]",
(m_pipcfgdb+ii)->szurl,(m_pipcfgdb+ii)->szhost,
(m_pipcfgdb+ii)->wapid,
(m_pipcfgdb+ii)->wmrid,
(m_pipcfgdb+ii)->inumdomain);
for(int jj=0;jj<m_pipcfgdb->inumdomain;jj++)
{
printf("[%s]",(m_pipcfgdb+ii)->szdomain+64*jj);
TLog::toErr("[%s]",(m_pipcfgdb+ii)->szdomain+64*jj);
}
printf("\n");
TLog::toErr("\n");
}
return m_totipcfg;
}
int CAppIp::initIpCfg(char *filename)
{
FILE *fp;
char szbuf[512];
size_t isize=511;
char *pbuf=szbuf;
fp=fopen(filename,"r");
if(fp==NULL)
{
printf("failure in open file [%s]",filename);
return -1;
}
m_totipcfg=0;
while(getline(&pbuf,&isize,fp)>0)
{
if(isize>10)
m_totipcfg++;
}
if(m_totipcfg<=0)
return 0;
m_pipcfg=new StIpCfg[m_totipcfg];
rewind(fp);
m_totipcfg=0;
int icurcfg=0;
int len;
while((len=getline(&pbuf,&isize,fp))>0)
{
pbuf[len-1]=0;
char *p=strtok(szbuf,",");
assert(p!=NULL);
{
(m_pipcfg+icurcfg)->option=*p;
}
p=strtok(NULL,",");
assert(p!=NULL);
{
struct in_addr inaddr;
if(!inet_aton(p, &inaddr))
{
printf("invalid ip=[%s]\n",p);
return -1;
}
(m_pipcfg+icurcfg)->ip=inaddr.s_addr;
}
p=strtok(NULL,",");
assert(p!=NULL);
{
strcpy((m_pipcfg+icurcfg)->szpost,p);
}
p=strtok(NULL,",");
assert(p!=NULL);
{
strcpy((m_pipcfg+icurcfg)->szurl,p);
}
p=strtok(NULL,",");
assert(p!=NULL);
{
(m_pipcfg+icurcfg)->wapid=atoi(p);
}
p=strtok(NULL,",");
assert(p!=NULL);
{
int inums=atoi(p);
(m_pipcfg+icurcfg)->inumdomain=inums;
(m_pipcfg+icurcfg)->szdomain=new char[64*inums];
for(int i=0;i<inums;i++)
{
p=strtok(NULL," ");
assert(p!=NULL);
assert(strlen(p)<32);
strcpy((m_pipcfg+icurcfg)->szdomain+i*32,p);
}
icurcfg++;
}
}
fclose(fp);
m_totipcfg=icurcfg;
for(int i=0;i<m_totipcfg;i++)
{
printf("option=[%c]\n",(m_pipcfg+i)->option);
printf("ip=[%u]\n",(m_pipcfg+i)->ip);
printf("post=[%s]\n",(m_pipcfg+i)->szpost);
printf("url=[%s]\n",(m_pipcfg+i)->szurl);
printf("wapid=[%d]\n",(m_pipcfg+i)->wapid);
printf("tot-domain=[%d]",(m_pipcfg+i)->inumdomain);
for(int j=0;j<(m_pipcfg+i)->inumdomain;j++)
{
printf("<%s>,",(m_pipcfg+i)->szdomain+32*j);
}
printf("\n\n");
}
return icurcfg;
}
bool CAppIp::initDb(char *filename)
{
char buf[128];
char buf1[128];
CConfig cfg;
if (cfg.ReadConfig(filename) != 0)
{
printf("Read %s Failed!\n",filename);
return false;
}
if(cfg.GetItemValue("DB", "name", buf)!=0)
{
printf("Read DB:id Failed!\n");
return false;
}
if(cfg.GetItemValue("DB", "passwd", buf1)!=0)
{
printf("Read DB:id Failed!\n");
return false;
}
COra *db=new COra(buf,buf1);
m_ptblweb=new CTblWeb();
m_pseqweb=new CSeqWeb();
m_psptblweb=new CSpTblWeb();
m_pspseqweb=new CSpSeqWeb();
m_pSeqSpWarm=new CSeqSpWarm();
m_pTblSpWarm=new CTblSpWarm();
return true;
}
bool CAppIp::initShm(char *filename)
{
char buf[128];
int ishmid,ishmsize;
CConfig cfg;
if (cfg.ReadConfig(filename) != 0)
{
printf("Read %s Failed!\n",filename);
return false;
}
if(cfg.GetItemValue("COLLSHM", "key_httpip", buf)!=0)
{
printf("Read SHM:id Failed!\n");
return false;
}
ishmid=atoi(buf);
if(cfg.GetItemValue("COLLSHM", "size_httpip", buf)!=0)
{
printf("Read SHM:size Failed!\n");
return false;
}
ishmsize=atoi(buf)*1024*1024;
m_pshm=new CShmApply();
printf("init shmid \n");
m_pshm->init(ishmid,ishmsize, SHM_APPPERM);
m_pInfo=new CDataInfo();
if(cfg.GetItemValue("IPWATCH", "key", buf)!=0)
{
printf("Read SHM:id Failed!\n");
exit(-1);
}
ishmid=atoi(buf);
if(cfg.GetItemValue("IPWATCH", "size", buf)!=0)
{
printf("Read SHM:size Failed!\n");
exit(-1);
}
ishmsize=atoi(buf)*1024*1024;
//m_prdsip=new CRtRdsIP();
m_prdsip.init(ishmid,ishmsize);
return true;
}
CAppIp::CAppIp(char *syscfg,char *ipcfg)
{
if(!initDb(syscfg))
{
printf("failure of initing dbcfg\n");
exit(-1);
}
#ifdef USEDBCFG
if( initIpCfgDB()<=0)
{
printf("failure of initing ipcofig\n");
exit(-1);
}
#else
if( initIpCfg(ipcfg)<=0)
{
printf("failure of initing ipcofig\n");
exit(-1);
}
#endif
if(!initShm(syscfg))
{
printf("failure of initing shmcofig\n");
exit(-1);
}
m_theinqStream=new Cmimestream();
m_pinqhv=new Chv();
m_pinqhv->init("Host,Connection,Referer,Content-Length,Content-Type,Cookie");
}
void CAppIp::run()
{
#ifdef FROMFILE
m_ilenrcv=readFile(m_szrcv);
#else
m_ilenrcv=m_pshm->read(m_szrcv);
#endif
if(m_ilenrcv<=0)
{
sleep(1);
return;
}
m_piph=(struct iphdr *)(m_szrcv ) ;
if(m_piph->version!=4)//ipv4
return;
if(m_piph->protocol!=6)//TCP协议
return;
m_ptcph=(struct tcphdr*)(m_szrcv + 4*m_piph->ihl);
int iplen=ntohs(m_piph->tot_len);
int tcphlen=m_ptcph->doff*4;
int iphlen=4*m_piph->ihl;
int datalen=iplen-tcphlen-iphlen;
if(datalen>0)
{
char *pdata=m_szrcv+iphlen+tcphlen;
#ifdef DEBUG
//TLog::toErr("tmplen=[%d]\n",m_ilenrcv);
saveIpFile(m_szrcv, m_ilenrcv,".");
#endif
if(m_prdsip.isInWatched(m_piph->saddr))
{
printf("------------this is tekong[%u] --------------\n",m_piph->saddr);
TLog::toErr("------------this is tekong[%u] --------------\n",m_piph->saddr);
/*#ifdef TRACEFILE
traceIpFile(m_szrcv, m_ilenrcv,"../tracelog");
#endif*/
processTKong(m_piph->daddr,pdata,datalen);
writeTKongPage(datalen);
registerWatchedObj();
registerContent();
}
#ifdef USEDBCFG
processFKongDB(m_piph->daddr,pdata,datalen);
#else
processFKong(m_piph->daddr,pdata,datalen);
#endif
}
}
void CAppIp::processTKong(u_int32_t ip, char *szdata,int lendata)
{
char *p;
int len;
char szbuf[1024];
memset(szbuf,0,sizeof(szbuf));
m_theinqStream->init(lendata,szdata);
len=m_theinqStream->getLine(szbuf,512);
if(len<=0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -