📄 mulpackview.cpp
字号:
// MulPackView.cpp : implementation file
//
#include "stdafx.h"
#include "SnifferPro.h"
#include "MulPackView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMulPackView
IMPLEMENT_DYNCREATE(CMulPackView, CListView)
CMulPackView::CMulPackView()
{
totalmem=0;
//tempmem=0;
delta=0;
time=0;
index=-1;
}
CMulPackView::~CMulPackView()
{
}
BEGIN_MESSAGE_MAP(CMulPackView, CListView)
//{{AFX_MSG_MAP(CMulPackView)
ON_MESSAGE(WM_MESSAGE_PACKET_RECEIVE,OnPacketReceive)
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
ON_MESSAGE(WM_MESSAGE_ONTIMER,OnMessageTimer)
ON_NOTIFY_REFLECT(LVN_ITEMCHANGING, OnItemchanging)
ON_WM_TIMER()
ON_NOTIFY_REFLECT(LVN_ITEMCHANGED, OnItemchanged)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMulPackView drawing
void CMulPackView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CMulPackView diagnostics
#ifdef _DEBUG
void CMulPackView::AssertValid() const
{
CListView::AssertValid();
}
void CMulPackView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMulPackView message handlers
void CMulPackView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
((CMainFrame *)AfxGetApp()->GetMainWnd())->mulPackView=this;
CListCtrl &ctrl=this->GetListCtrl();
//设置风格
DWORD log = GetWindowLong(ctrl.GetSafeHwnd(),GWL_STYLE);
log |= LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS;
SetWindowLong(ctrl.GetSafeHwnd(),GWL_STYLE,log);
HICON hIcon[2];
hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_STOP);
hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_START);
m_imageList.Create(12,12,0,3,3);
m_imageList.Add(hIcon[0]);
m_imageList.Add(hIcon[1]);
ctrl.SetImageList(&m_imageList,TVSIL_NORMAL);
//设置列信息
ctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
ctrl.InsertColumn(0,"Order",LVCFMT_RIGHT,50);
ctrl.InsertColumn(1,"IP Identification",LVCFMT_RIGHT,100);
ctrl.InsertColumn(2,"Source Address",LVCFMT_RIGHT,150);
ctrl.InsertColumn(3,"Destination Address",LVCFMT_RIGHT,150);
ctrl.InsertColumn(4,"IP Length",LVCFMT_RIGHT,80);
ctrl.InsertColumn(5,"Type",LVCFMT_RIGHT,50);
ctrl.InsertColumn(6," ",LVCFMT_LEFT,100);
}
void CMulPackView::OnPacketReceive(const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
{
int index=0;
int count=0;
char str[10];
char iplen[6];
struct pcap_pkthdr *header;
const u_char *data;
unsigned char *pos=(unsigned char *)pkt_data;
int type;
CListCtrl &ctrl=this->GetListCtrl();
//将所捕获包的内容复制下来,并保存到CArray中,以备将来使用
header=new pcap_pkthdr;
header->caplen=pkt_header->caplen;
header->len=pkt_header->len;
data=new unsigned char[header->len];
memcpy((void *)data,pkt_data,header->len);
this->pkt_headers.Add(header);
this->pkt_datas.Add(data);
//在ListCtrl中插入新的包
index=pkt_headers.GetSize()-1;
sprintf(str,"%00005d",index+1);
count=ctrl.InsertItem(index,str,0);
pos+=12;//进行判断包类型
type=(*pos)*0x100;
pos++;
type+=(*pos);
if(type==0x0800){//IP,在ListCtrl中添加一行
IPGram ip(data+14,header->len-14);
this->totalmem += ip.datalen+ip.IHL*4+14;
sprintf(iplen,"%4d",ip.totallen);
ctrl.SetItemText(count,1,ip.GetID());
ctrl.SetItemText(count,2,ip.GetSrcAddr());
ctrl.SetItemText(count,3,ip.GetDestAddr());
ctrl.SetItemText(count,4,iplen);
ctrl.SetItemText(count,5,ip.GetService());
}
else if(type==0x0806){//ARP,在ListCtrl中添加一行
ARPGram arp(data+14,header->len-14);
this->totalmem +=42;
ctrl.SetItemText(count,1,"");
ctrl.SetItemText(count,2,arp.GetSrcPrtAddr());
ctrl.SetItemText(count,3,arp.GetDestPrtAddr());
ctrl.SetItemText(count,4,"");
ctrl.SetItemText(count,5,"ARP");
}
else if(type==0x8035){//RARP,在ListCtrl中添加一行
RARPGram rarp(data+14,header->len-14);
this->totalmem +=42;
ctrl.SetItemText(count,1,"");
ctrl.SetItemText(count,2,rarp.GetSrcPrtAddr());
ctrl.SetItemText(count,3,rarp.GetDestPrtAddr());
ctrl.SetItemText(count,4,"");
ctrl.SetItemText(count,5,"RARP");
}
}
void CMulPackView::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CMulPackView::OnMessageTimer() //每秒钟统计抓到的包信息,每1000ms触发一次(收到一个WM_MESSAGE_ONTIMER消息)
{
// TODO: Add your message handler code here and/or call default
time+=1;
//Set Status Bar
CString status;
status.Format("Total Packets: %d Total Memory: %d,%003d KB Time Elapsed: %u Seconds",pkt_headers.GetSize(),totalmem/0x100000,(totalmem%1000000)/0x400,time);
((CMainFrame *)AfxGetApp()->GetMainWnd())->m_wndStatusBar.SetPaneText(0,""+status,TRUE);
((CMainFrame *)AfxGetApp()->GetMainWnd())->m_progStatusBar.OnProgress(delta*8*100/10000000);
delta=0;
}
void CMulPackView::OnItemchanging(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CMulPackView::OnTimer(UINT nIDEvent)
{
CListView::OnTimer(nIDEvent);
}
void CMulPackView::OnItemchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
if(((CMainFrame *)AfxGetApp()->GetMainWnd())->stcView->isReassembly){//处于重组状态
if(MessageBox("处于重组状态,显示一个报文内容会丢失组装后的数据,是否继续?",NULL,MB_OKCANCEL)==IDCANCEL)
return;
}
CListCtrl &ctrl=this->GetListCtrl();
ctrl.DeleteColumn(6);
ctrl.InsertColumn(6," ",LVCFMT_LEFT,100);
int count=ctrl.GetItemCount();
if(count==0)
return;
index=pNMListView->iItem;
int i=((CMainFrame *)AfxGetApp()->GetMainWnd())->mulPackView->pkt_datas.GetSize();
//通知CSinPackView和CStcView刷新为新选中的报文内容
::PostMessage(*((CMainFrame *)AfxGetApp()->GetMainWnd())->sinPackView,WM_MESSAGE_PACKET_SELECT,(WPARAM)this->pkt_headers.GetAt(index),(LPARAM)this->pkt_datas.GetAt(index));
::PostMessage(*((CMainFrame *)AfxGetApp()->GetMainWnd())->stcView,WM_MESSAGE_PACKET_SELECT,(WPARAM)this->pkt_headers.GetAt(index),(LPARAM)this->pkt_datas.GetAt(index));
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -