📄 ipcontrolview.cpp
字号:
// 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 + -