📄 apptelnet.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <unistd.h>
#include <netinet/if_ether.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
#include <arpa/inet.h>
#include <time.h>
#include <BaseConst.h>
#include <RtRadiusIP.h>
#include <Utility.h>
#include <Config.h>
#include "AppTelnet.h"
#define SIMULATE_SPE
void CAppTelnet::timeOut()
{
m_pappisf->timeOut();
}
void CAppTelnet::run()
{
struct iphdr *ptr_iph; // IP报头
struct tcphdr *ptr_tcph; // TCP报头
m_ilenrcv=m_pshm->read(m_szrcv);
if(m_ilenrcv<=0)
{
sleep(1);
return;
}
ptr_iph=(struct iphdr *)(m_szrcv ) ;
if(ptr_iph->version!=4)//ipv4
return;
if(ptr_iph->protocol!=6)//TCP协议
return;
ptr_tcph=(struct tcphdr*)(m_szrcv + 4*ptr_iph->ihl);
if(ptr_tcph->source==5888 )
{
m_socket.saddr=ptr_iph->daddr;
m_socket.daddr=ptr_iph->saddr;
m_socket.sport=ptr_tcph->dest;
m_socket.dport=ptr_tcph->source;
}
else if( ptr_tcph->dest==5888 )
{
m_socket.saddr=ptr_iph->saddr;
m_socket.daddr=ptr_iph->daddr;
m_socket.sport=ptr_tcph->source;
m_socket.dport=ptr_tcph->dest;
}
else
return;
if(ptr_tcph->syn)
{
if(m_pappisf->searchFp(&m_socket)==NULL)
{
char szfilename[128];
getFileName(&m_socket,szfilename);
m_pappisf->addOneStream(&m_socket,szfilename);
#ifdef DEBUG
printf("start socket[%s]:\n",szfilename);
#endif
}
}
else if(ptr_tcph->fin)
{
#ifdef DEBUG
char szfilename[128];
getFileName(&m_socket,szfilename);
szfilename[strlen(szfilename)-14]=0;
printf("closed socket[%s]:\n",szfilename);
#endif
STRU_TR_T_TELNETINFO rec;
rec.TLN_FILELENGTH=m_pappisf->delOneStream(&m_socket,rec.TLN_STRATTIME,rec.TLN_FILEPATH);
if(rec.TLN_FILELENGTH>0)
{
struct in_addr inaddr;
rec.TLN_ID=m_pseqcomm->getS_TR_T_TELNETINFO();
strcpy(rec.TLN_STOPTIME,TUTime::YYYYMMDDHHMMSS());
inaddr.s_addr = m_socket.saddr;
sprintf(rec.TLN_CLIENTIP,"%s",inet_ntoa(inaddr));
inaddr.s_addr = m_socket.daddr;
sprintf(rec.TLN_SERVERIP,"%s",inet_ntoa(inaddr));
strcpy(rec.TLN_CLIENTLOCATION,"office");
strcpy(rec.TLN_CLIENTACCOUNT,"office");
strcpy(rec.TLN_CLIENTCALLID,"office");
strcpy(rec.TLN_SERVERLOCATION,"office");
strcpy(rec.TLN_SERVERACCOUNT,"office");
strcpy(rec.TLN_SERVERCALLID,"office");
rec.TLN_FILESTATUS=1;
m_ptblcomm->insRecord(&rec);
registerWatchedObj();
}
}
else
{
FILE *fp;
fp=m_pappisf->searchFp(&m_socket);
if(fp!=NULL)
{
ptr_tcph=(struct tcphdr*)(m_szrcv + 4*ptr_iph->ihl);
int iplen=ntohs(ptr_iph->tot_len);
int tcphlen=ptr_tcph->doff*4;
int iphlen=4*ptr_iph->ihl;
int datalen=iplen-tcphlen-iphlen;
if(datalen>0)
{
char *pdata=m_szrcv+iphlen+tcphlen;
int outlen=filterCtrlChar(pdata,datalen,m_szdata);
if(ptr_tcph->source==5888 )
fprintf(fp,"\n%s:%05d\n","server",datalen);
else
fprintf(fp,"\n%s:%05d\n","client",datalen);
fwrite(pdata,datalen,1,fp);
//fwrite(m_szdata,outlen,1,fp);
fflush(fp);
}
}
}
}
int CAppTelnet::filterCtrlChar(char *pin, int len, char *pout)
{
int i,olen=0;
for(int i=0;i<len;i++)
{
if(!((unsigned char)*pin & (unsigned char)0x80))
{
*pout=*pin;
pout++;
olen++;
}
pin++;
}
*pout=0;
return olen;
}
int CAppTelnet::registerWatchedObj()
{
#ifdef SIMULATE_SPE
STRU_TR_T_OBJECT2INFO rec;
rec.OTI_ID=m_pSeqSpWarm->getS_TR_T_OBJECT2INFO();
rec.AMG_ID=102;
rec.OTI_INFOID=m_pseqcomm->getfkS_TR_T_TELNETINFO();
rec.OTI_INFOTYPE=8;
rec.OTI_RPRECISION=0;
rec.OTI_READSTATUS=1;
m_pTblSpWarm->insRecord(&rec);
return 102;
#else
ST_AIMOBJ stObj[32];
int iobjs=m_prdsip->isInWatched(m_socket.saddr,stObj);
for(int i=0;i<iobjs;i++)
{
STRU_TR_T_OBJECT2INFO rec;
rec.OTI_ID=m_pSeqSpWarm->getS_TR_T_OBJECT2INFO();
rec.AMG_ID=stObj[i].amgid;
rec.OTI_INFOID=m_pseqcomm->getfkS_TR_T_TELNETINFO();
rec.OTI_INFOTYPE=8;
rec.OTI_RPRECISION=stObj[i].precision;
rec.OTI_READSTATUS=1;
m_pTblSpWarm->insRecord(&rec);
}
return stObj[0].amgid;;
#endif
}
void CAppTelnet::getFileName(Stru_Socket *psocket,char *filename)
{
struct in_addr inaddr;
inaddr.s_addr = psocket->saddr;
sprintf(filename,"/telnetdata/%s::%d--",inet_ntoa(inaddr),ntohs(psocket->sport));
inaddr.s_addr = psocket->daddr;
sprintf(filename+strlen(filename),"%s::%d--",inet_ntoa(inaddr),ntohs(psocket->dport));
strcat(filename,".");
strcat(filename,TUTime::YYYYMMDDHHMMSS());
}
CAppTelnet::~CAppTelnet()
{
}
CAppTelnet::CAppTelnet(char *filename)
{
int ishmid,ishmsize;
char buf[128];
char buf1[128];
CConfig cfg;
if(filename==NULL)
{
if (cfg.ReadConfig("../etc/config.ini") != 0)
{
if (cfg.ReadConfig("config.ini") != 0)
{
printf("Read config.ini Failed!\n");
exit(-1);
}
}
}
else
{
if (cfg.ReadConfig(filename) != 0)
{
printf("Read %s Failed!\n",filename);
exit(-1);
}
}
if(cfg.GetItemValue("DB", "name", buf)!=0)
{
printf("Read DB:id Failed!\n");
exit(-1);
}
if(cfg.GetItemValue("DB", "passwd", buf1)!=0)
{
printf("Read DB:id Failed!\n");
exit(-1);
}
COra *db=new COra(buf,buf1);
if(cfg.GetItemValue("COLLSHM", "key_telnet", buf)!=0)
{
printf("Read SHM:id Failed!\n");
exit(-1);
}
ishmid=atoi(buf);
if(cfg.GetItemValue("COLLSHM", "size_telnet", buf)!=0)
{
printf("Read SHM:size Failed!\n");
exit(-1);
}
ishmsize=atoi(buf)*1024*1024;
m_pshm=new CShmApply();
printf("init shmid \n");
m_pshm->init(ishmid,ishmsize, 0666);
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);
m_pappisf=new CIpStreamFile(10);
m_ptblcomm=new CTblComm();
m_pseqcomm=new CSeqComm();
m_pSeqSpWarm=new CSeqSpWarm();
m_pTblSpWarm=new CTblSpWarm();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -