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

📄 ipcontrolview.cpp

📁 入侵检测系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// IPControlView.cpp : implementation of the CIPControlView class
//

#include "stdafx.h"
#include "IPControl.h"
#include "Brow.h"
#include "IPControlDoc.h"
#include "IPControlView.h"
#include <memory.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif



/////////////////////////////////////////////////////////////////////////////
// CIPControlView

IMPLEMENT_DYNCREATE(CIPControlView, CView)

BEGIN_MESSAGE_MAP(CIPControlView, CView)
	//{{AFX_MSG_MAP(CIPControlView)
	ON_COMMAND(ID_BUTTONSTART, OnButtonstart)
	ON_UPDATE_COMMAND_UI(ID_BUTTONSTART, OnUpdateButtonstart)
	ON_COMMAND(ID_BUTTONSTOP, OnButtonstop)
	ON_UPDATE_COMMAND_UI(ID_BUTTONSTOP, OnUpdateButtonstop)
	ON_COMMAND(ID_FILE_NEW, OnFileNew)
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_BUTTONVIEW, OnButtonview)
	ON_COMMAND(IDM_IDSRULE, OnIdsrule)
	ON_COMMAND(ID_HELP, OnHelp)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIPControlView construction/destruction

CIPControlView::CIPControlView()
{
	// TODO: add construction code here
	p_Frame=NULL;
	m_pEdit=NULL;
	m_pTree=NULL;
	m_pList=NULL;
	m_pComboBox=NULL;
//统计各种包的计数器
	m_nIPNumPerSec=0;
	m_nTotalPacket=0;
	m_nTCPPacket=0;
	m_nUDPPacket=0;
	m_nICMPPacket=0;
	m_nOtherPacket=0;
    m_nTotalTime=0;

	m_bEnableStart=true;//开始按钮有效
	m_bEnableStop=false; //停止按钮无效


    m_nTimeID=0; //定时器

	m_pViewDlg=NULL;

}

CIPControlView::~CIPControlView()
{
	if(m_pViewDlg!=NULL)
	{		
		m_pViewDlg->DestroyWindow();
		//delete m_pViewDlg;
	}
}

BOOL CIPControlView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CIPControlView drawing

void CIPControlView::OnDraw(CDC* pDC)
{
	CIPControlDoc* pDoc = GetDocument();
    
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CIPControlView printing

BOOL CIPControlView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CIPControlView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CIPControlView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CIPControlView diagnostics

#ifdef _DEBUG
void CIPControlView::AssertValid() const
{
	CView::AssertValid();
}

void CIPControlView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CIPControlDoc* CIPControlView::GetDocument() // non-debug version is inline
{   
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIPControlDoc)));
	return (CIPControlDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CIPControlView message handlers


//开始捕获数据
void CIPControlView::OnButtonstart() 
{
	// TODO: Add your command handler code here
	p_Frame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
	m_pEdit=p_Frame->GetEdit(); //获取编辑筐的指针
	m_pList=p_Frame->GetList(); //获取列表筐的指针
	m_pTree=p_Frame->GetTree(); //获取树型控件的指针
	m_pComboBox=p_Frame->GetComboBox() ;//获取组合框的指针
	int index=m_pComboBox->GetCurSel(); //获得组合筐的选择
    if(index==CB_ERR || index==-1)
	{
    	MessageBox("请选择适配器!");
    	return;
	}
	//DataPacket* pdata=(DataPacket*)(m_pDoc->m_data.GetTail());
	m_pDoc=this->GetDocument();
	m_pEdit->SetWindowText("已经开始捕获数据.......");
	
	
    m_pDoc->StartCapture(index);//开始捕获数据包 index为要捕获的网络设备的序号
	
	m_bEnableStart=false;
	m_bEnableStop=true;

	//开启定时器 时间为1秒 用于统计IP流量
	m_nTimeID=SetTimer(411,1000,NULL); //每半秒钟统计一次
	if(m_nTimeID==0)
	{
		MessageBox("设置定时器错误");
		return;
	}
}

//停止捕获数据
void CIPControlView::OnButtonstop() 
{
	// TODO: Add your command handler code here
	if(m_nTimeID!=0)
	{
		KillTimer(m_nTimeID);
	}
	m_pDoc=this->GetDocument();
	int res=m_pDoc->StopCapture();
	if(res==0)
	{
		MessageBox("捕获线程还没有运行!");
		return;
	}
	else if(res==-1)
	{
		MessageBox("无法停止捕获线程,请稍后再试!");
		return;
	}
	else if(res==1)
	{
		/*MessageBox("成功!");*/
		CString str;
		CString totle;
		CString tcp;
		CString udp;
		CString icmp;
		CString other;
		CString persec;
		CString totaltime;
		totaltime.Format("=========已经停止捕获数据包. 捕获总时间=%d秒.=========",m_nTotalTime);
		totle.Format("=========总数=%d (",m_nTotalPacket);
		tcp.Format("TCP=%d  ",m_nTCPPacket);
		udp.Format("UDP=%d  ",m_nUDPPacket);
		icmp.Format("ICMP=%d  ",m_nICMPPacket);
		other.Format("其他=%d) ",m_nOtherPacket);
		CString savefile;
		savefile.Format("=========本次捕获的所有数据已经保存在 \"%s\" 中.=========",m_pDoc->filename);
		CString info;
		info.Format("=========网络入侵检测系统Designed by LiuLiang=========");
		str=totaltime+"\r\n"+totle+tcp+udp+icmp+other+"\r\n"+savefile+"\r\n"+info;
		m_pEdit->SetWindowText(str);
	}
	m_bEnableStart=true;
	m_bEnableStop=false;
	//pcap_freealldevs()
}

void CIPControlView::OnUpdateButtonstart(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_bEnableStart);
}
//可以用一个函数来专门分析数据包,然后再更新显示
//分析序号为index的数据包 失败返回-1  成功返回1
//DEL int CIPControlView::AnalyzePacket(int index)
//DEL {
//DEL 	m_pDoc=this->GetDocument();
//DEL 	POSITION pos=m_pDoc->m_data.FindIndex(index);
//DEL 	if(pos==NULL)
//DEL 	{
//DEL 		return -1;		
//DEL 	}
//DEL 	DataPacket* pdata=(DataPacket*)m_pDoc->m_data.GetAt(pos); //获得要分析的数据包
//DEL 	if(pdata==NULL)
//DEL 	{
//DEL 		return -1;
//DEL 	}
//DEL 	struct pcap_pkthdr* header;
//DEL 	const u_char* pkt_data;
//DEL 
//DEL //	header=&(pdata->thisheader);
//DEL //	pkt_data=&(pdata->thispkt_data);
//DEL 
//DEL 	header=pdata->thisheader;
//DEL 	pkt_data=pdata->thispkt_data;
//DEL 	//序号
//DEL 	sprintf(m_strPacketIndex,"%d",index);
//DEL 	//时间
//DEL 	struct tm *ltime;
//DEL 	ltime=localtime(&header->ts.tv_sec);
//DEL 	strftime(m_strTime,sizeof(m_strTime),"%H:%M:%S",ltime);
//DEL 
//DEL 	CString str;
//DEL 	str.Format("%d ==> %s",index,m_strTime);
//DEL 	m_pEdit->SetWindowText(str);
//DEL 	
//DEL 
//DEL 	sprintf(m_strLen,"%d",header->len);
//DEL 	//源MAC 目的MAC
//DEL 	mac_header* mh;
//DEL 	mh=(mac_header*)pkt_data; //mac头指针
//DEL 	memset(m_strSourMAC,0,sizeof(m_strSourMAC));
//DEL 	memset(m_strDestMAC,0,sizeof(m_strDestMAC));
//DEL 	for(int i=0;i<6;i++)
//DEL 	{
//DEL 		char sm[3];
//DEL 		if(i!=5)
//DEL 		{
//DEL 			sprintf(sm,"%X.",mh->sadd[i]);
//DEL 			strcat(m_strSourMAC,sm);
//DEL 			sprintf(sm,"%X.",mh->dadd[i]);
//DEL 			strcat(m_strDestMAC,sm);
//DEL 		}
//DEL 		else //i==5
//DEL 		{
//DEL 			sprintf(sm,"%X",mh->sadd[i]);
//DEL 			strcat(m_strSourMAC,sm);
//DEL 			sprintf(sm,"%X",mh->dadd[i]);
//DEL 			strcat(m_strDestMAC,sm);
//DEL 		}		
//DEL 	}
//DEL 	//类型
//DEL 	ip_header* ih;//ip头
//DEL 	u_int ip_len; //ip头长度 不固定的  不同于ip总长度
//DEL 	tcp_header* tcph;
//DEL 	udp_header* udph;
//DEL 	ih=(ip_header*)(pkt_data+14); //不能ih=(ip_header*)pkt_data+14;否则会出错
//DEL 	m_pih=ih; //m_pih保存了最后一次分析的数据包的ip头
//DEL 	ip_len=(ih->ver_ihl & 0xf)*4;
//DEL 	m_nPacketLen=ip_len; //保存包长度
//DEL 	u_short sport,dport;//变量保存源和目的端口
//DEL 	switch(ih->proto)
//DEL 	{
//DEL 	case TCP_PROTO: //TCP包
//DEL 		strcpy(m_strPacketType,"TCP");
//DEL 		tcph=(tcp_header*)((u_char*)ih+ip_len);
//DEL 		m_ptcph=tcph; //m_ptchp保存了最后一次分析的数据包的tcp头
//DEL 		sport=ntohs(tcph->sport);//端口
//DEL 		dport=ntohs(tcph->dport);
//DEL 		break;
//DEL 	case UDP_PROTO: //UDP包
//DEL 		strcpy(m_strPacketType,"UDP");
//DEL 		udph=(udp_header*)((u_char*)ih+ip_len);
//DEL 		m_pudph=udph; //m_pudph保存了最后一次分析的数据包的udp头
//DEL 		sport=ntohs(udph->sport);
//DEL 		dport=ntohs(udph->dport);
//DEL 		break;
//DEL 	case ICMP_PROTO: //ICMP包
//DEL 		strcpy(m_strPacketType,"ICMP");
//DEL 		//还没有做
//DEL 		break;
//DEL 	default: //其他包
//DEL 		strcpy(m_strPacketType,"Other");
//DEL 		break;
//DEL 	}	
//DEL 	//源IP/端口
//DEL 	memset(m_strSourIP,0,sizeof(m_strSourIP));
//DEL 	sprintf(m_strSourIP,"%d.%d.%d.%d",
//DEL 		ih->saddr.byte1,
//DEL 		ih->saddr.byte2,
//DEL 		ih->saddr.byte3,
//DEL 		ih->saddr.byte4);
//DEL 	sprintf(m_strSport,"%d",sport);
//DEL 	
//DEL 	//目的IP/端口
//DEL 	memset(m_strDestIP,0,sizeof(m_strDestIP));
//DEL 	sprintf(m_strDestIP,"%d.%d.%d.%d",
//DEL 		ih->daddr.byte1,
//DEL 		ih->daddr.byte2,
//DEL 		ih->daddr.byte3,
//DEL 		ih->daddr.byte4);
//DEL 	sprintf(m_strDport,"%d",dport);
//DEL 	return 1;
//DEL }

//Doc捕获到数据后,View更新列表控件
void CIPControlView::UpdateList()
{
	if(p_Frame==NULL)
	{
		p_Frame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
		m_pEdit=p_Frame->GetEdit(); //获取编辑筐的指针
		m_pList=p_Frame->GetList(); //获取列表筐的指针
		m_pTree=p_Frame->GetTree(); //获取树型控件的指针
	}
	m_pDoc=this->GetDocument();
	DataPacket* pdata=(DataPacket*)(m_pDoc->m_data.GetTail()); //取得最后保存的数据
	m_pDoc->AnalyzeData(pdata);
	//更新列表显示
	char itemname[10];
	sprintf(itemname,"packet%d",m_pDoc->m_nPackerNum);
	int nItem=m_pList->InsertItem(m_pDoc->m_nPackerNum++,itemname);
	m_pList->SetItemText(nItem,0,m_pDoc->m_strPacketIndex); //序号
	m_pList->SetItemText(nItem,1,m_pDoc->m_strTime);//时间
	m_pList->SetItemText(nItem,2,m_pDoc->m_strLen);//长度
	m_pList->SetItemText(nItem,3,m_pDoc->m_strSourMAC); //源MAC
	m_pList->SetItemText(nItem,4,m_pDoc->m_strDestMAC); //目的MAC
	m_pList->SetItemText(nItem,5,m_pDoc->m_strPacketType);// 类型
	char temp[30];
	sprintf(temp,"%s/%s",m_pDoc->m_strSourIP,m_pDoc->m_strSport);//源IP/源端口
	m_pList->SetItemText(nItem,6,temp);
	sprintf(temp,"%s/%s",m_pDoc->m_strDestIP,m_pDoc->m_strDport);//目的IP/目的端口
	m_pList->SetItemText(nItem,7,temp);

⌨️ 快捷键说明

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