📄 monitorpackets.cpp
字号:
// MonitorPackets.cpp : 实现文件
//
#include "stdafx.h"
#include "monitor.h"
#include "MonitorPackets.h"
#include "monitorpackets.h"
#include "define.h"
#include "globals.h"
#include "monitorpackets.h"
// CMonitorPackets 对话框
IMPLEMENT_DYNAMIC(CMonitorPackets, CPropertyPage)
CMonitorPackets::CMonitorPackets()
: CPropertyPage(CMonitorPackets::IDD)
{
}
CMonitorPackets::~CMonitorPackets()
{
}
void CMonitorPackets::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_PACKETS, m_PacketsList);
}
BEGIN_MESSAGE_MAP(CMonitorPackets, CPropertyPage)
ON_NOTIFY(NM_CLICK, IDC_LIST_PACKETS, OnNMClickListPackets)
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CMonitorPackets 消息处理程序
void CMonitorPackets::InitPacketListHeader(void)
{
m_PacketsList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
m_PacketsList.InsertColumn(0,"日期/时间", LVCFMT_CENTER,130);
m_PacketsList.InsertColumn(1,"源地址", LVCFMT_CENTER,110);
m_PacketsList.InsertColumn(2,"目标地址", LVCFMT_CENTER,110);
m_PacketsList.InsertColumn(3,"帧", LVCFMT_CENTER,50);
m_PacketsList.InsertColumn(4,"协议", LVCFMT_CENTER,40);
m_PacketsList.InsertColumn(5,"源MAC地址", LVCFMT_CENTER,120);
m_PacketsList.InsertColumn(6,"目标MAC地址", LVCFMT_CENTER,120);
m_PacketsList.InsertColumn(7,"源端口", LVCFMT_CENTER,60);
m_PacketsList.InsertColumn(8,"目标端口", LVCFMT_CENTER,60);
m_PacketsList.InsertColumn(9,"大小", LVCFMT_CENTER,40);
}
BOOL CMonitorPackets::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
InitPacketListHeader();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMonitorPackets::InsertIPPacket(const u_char * p)
{
m_PacketsList.SetItemText(0,3,"IP");
PROTOCOL_DEFINE::IP_HEADER * ip=(PROTOCOL_DEFINE::IP_HEADER *)p;
char buffer[256];
//源地址
memset(buffer,0,256);
sprintf(buffer,"%d.%d.%d.%d",ip->src_addr[0],ip->src_addr[1],ip->src_addr[2],ip->src_addr[3]);
m_PacketsList.SetItemText(0,1,buffer);
//目标地址
memset(buffer,0,256);
sprintf(buffer,"%d.%d.%d.%d",ip->des_addr[0],ip->des_addr[1],ip->des_addr[2],ip->des_addr[3]);
m_PacketsList.SetItemText(0,2,buffer);
//协议
memset(buffer,0,256);
switch(ip->protocol)
{
case ICMP:
strcpy(buffer,"ICMP");
break;
case TCP:
strcpy(buffer,"TCP");
InsertTCPUDPPacketPort(p+PROTOCOL_DEFINE::get_IP_HEADER_length(ip));
break;
case EGP:
strcpy(buffer,"EGP");
break;
case IGP:
strcpy(buffer,"IGP");
break;
case UDP:
strcpy(buffer,"UDP");
InsertTCPUDPPacketPort(p+PROTOCOL_DEFINE::get_IP_HEADER_length(ip));
break;
default:
sprintf(buffer,"%d",ip->protocol);
break;
}
m_PacketsList.SetItemText(0,4,buffer);
}
void CMonitorPackets::InsertTCPUDPPacketPort(const u_char * p)
{
//由于TCP和UDP表示端口的方法一致,故简单的当作TCP处理
PROTOCOL_DEFINE::TCP_HEADER * tcp=(PROTOCOL_DEFINE::TCP_HEADER *)p;
char buffer[256];
int port=0;
//源端口
memset(buffer,0,256);
port=tcp->src_port[0]*0x100+tcp->src_port[1];
sprintf(buffer,"%d",port);
m_PacketsList.SetItemText(0,7,buffer);
//目标端口
memset(buffer,0,256);
port=tcp->des_port[0]*0x100+tcp->des_port[1];
sprintf(buffer,"%d",port);
m_PacketsList.SetItemText(0,8,buffer);
}
void CMonitorPackets::InsertARPRARPPacket(const u_char * p)
{
PROTOCOL_DEFINE::ARP_PROTOCOL * arp=(PROTOCOL_DEFINE::ARP_PROTOCOL *)p;
char buffer[256];
//源地址
memset(buffer,0,256);
sprintf(buffer,"%d.%d.%d.%d",arp->src_addr[0],arp->src_addr[1],arp->src_addr[2],arp->src_addr[3]);
m_PacketsList.SetItemText(0,1,buffer);
//目标地址
memset(buffer,0,256);
sprintf(buffer,"%d.%d.%d.%d",arp->des_addr[0],arp->des_addr[1],arp->des_addr[2],arp->des_addr[3]);
m_PacketsList.SetItemText(0,2,buffer);
}
void CMonitorPackets::OnNMClickListPackets(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
int index=m_PacketsList.GetNextItem(-1, LVNI_SELECTED);
if(index<0)
return;
byte * data=(byte *)m_PacketsList.GetItemData(index);
CString strSize=m_PacketsList.GetItemText(index,9);
int size=atoi(strSize);
CPropertySheet * pSheet=(CPropertySheet *)GetParent();
if(pSheet)
{
CPropertyPage * page=pSheet->GetPage(1);
pSheet->SetActivePage(page);
page->SendMessage(WM_DATA_TRANSLATE,(WPARAM)data,(LPARAM)size);
}
*pResult = 0;
}
void CMonitorPackets::OnDestroy()
{
CPropertyPage::OnDestroy();
int icount=m_PacketsList.GetItemCount();
for(int i=0;i<icount;i++)
{
byte * data=(byte *)m_PacketsList.GetItemData(i);
delete []data;
m_PacketsList.SetItemData(i,0);
}
// TODO: 在此处添加消息处理程序代码
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -