📄 packettreedata.cpp
字号:
// PacketTreeData.cpp : 实现文件
//
#include "stdafx.h"
#include "monitor.h"
#include "PacketTreeData.h"
#include "define.h"
#include "globals.h"
#include ".\packettreedata.h"
// CPacketTreeData 对话框
IMPLEMENT_DYNAMIC(CPacketTreeData, CPropertyPage)
CPacketTreeData::CPacketTreeData()
: CPropertyPage(CPacketTreeData::IDD)
{
}
CPacketTreeData::~CPacketTreeData()
{
}
void CPacketTreeData::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE_PACKET, m_DataTree);
DDX_Control(pDX, IDC_EDIT_PACKET_DATA, m_DataDisplay);
}
BEGIN_MESSAGE_MAP(CPacketTreeData, CPropertyPage)
ON_MESSAGE( WM_DATA_TRANSLATE, OnDataTranslate )
END_MESSAGE_MAP()
// CPacketTreeData 消息处理程序
LRESULT CPacketTreeData::OnDataTranslate(WPARAM wParam,LPARAM lParam)
{
byte * data=(byte *)wParam;
int size=(int)lParam;
//删除所有原先的数据项目
m_DataTree.DeleteAllItems();
PROTOCOL_DEFINE::ETHERNET_HEADER * eth=(PROTOCOL_DEFINE::ETHERNET_HEADER *)data;
HTREEITEM hItem=m_DataTree.InsertItem(_T("数据包"));
char buffer[256];
char mac[20];
//源MAC地址
memset(buffer,0,256);
PROTOCOL_DEFINE::get_MAC_addr(eth->src_mac,mac,20);
sprintf(buffer,"源MAC:%s",mac);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//目标MAC地址
memset(buffer,0,256);
PROTOCOL_DEFINE::get_MAC_addr(eth->des_mac,mac,20);
sprintf(buffer,"目标MAC:%s",mac);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//类型
memset(buffer,0,256);
sprintf(buffer,"类型:0x%02X%02X",eth->type[0],eth->type[1]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
memset(buffer,0,256);
sprintf(buffer,"0x%02X%02X",eth->type[0],eth->type[1]);
if(strcmp(buffer,IP)==0)//IP数据包
{
PROTOCOL_DEFINE::IP_HEADER * ip=(PROTOCOL_DEFINE::IP_HEADER *)(data+sizeof(PROTOCOL_DEFINE::ETHERNET_HEADER));
InsertIPTree(ip,hItem);
}
else if(strcmp(buffer,ARP)==0)//ARP数据包
{
PROTOCOL_DEFINE::ARP_PROTOCOL * arp=(PROTOCOL_DEFINE::ARP_PROTOCOL *)(data+sizeof(PROTOCOL_DEFINE::ETHERNET_HEADER));
HTREEITEM hARpItem=m_DataTree.InsertItem(_T("ARP"),hItem,TVI_LAST );
//InsertARPRARPTree(arp,hARpItem);
}
else if(strcmp(buffer,RARP)==0)//RARP数据包
{
PROTOCOL_DEFINE::ARP_PROTOCOL * arp=(PROTOCOL_DEFINE::ARP_PROTOCOL *)(data+sizeof(PROTOCOL_DEFINE::ETHERNET_HEADER));
HTREEITEM hARpItem=m_DataTree.InsertItem(_T("RARP"),hItem,TVI_LAST );
//InsertARPRARPTree(arp,hARpItem);
}
else//不支持的数据包
{
m_DataTree.InsertItem(_T("不支持的数据报"),hItem,TVI_LAST );
}
m_DataTree.Expand(m_DataTree.GetRootItem(),TVE_EXPAND);
m_DataTree.Invalidate();
m_DataDisplay.SetData(data, size, size + 10);
m_DataDisplay.RedrawWindow();
return 0;
}
/*void CPacketTreeData::InsertARPRARPTree(PROTOCOL_DEFINE::ARP_PROTOCOL * arp,HTREEITEM hItem)
{
char buffer[256];
memset(buffer,0,256);
sprintf(buffer,"硬件类型:%d",arp->hw_type[0]*0x100+arp->hw_type[1]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//协议类型
memset(buffer,0,256);
sprintf(buffer,"协议类型:0x%02x%02x",arp->protocol[0],arp->protocol[1]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//物理地址长度
memset(buffer,0,256);
sprintf(buffer,"物理地址长度:%d",arp->hw_len);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//协议地址长度
memset(buffer,0,256);
sprintf(buffer,"协议地址长度:%d",arp->protocol_len);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//操作号
memset(buffer,0,256);
sprintf(buffer,"操作号:%d",arp->opcode[0]*0x100+arp->opcode[1]);
HTREEITEM hOPItem=m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//发送端MAC地址
memset(buffer,0,256);
sprintf(buffer,"发送端MAC地址:%02X-%02X-%02X-%02X-%02X-%02X",
arp->src_mac[0],arp->src_mac[1],arp->src_mac[2],arp->src_mac[3],
arp->src_mac[4],arp->src_mac[5]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//发送端IP地址
memset(buffer,0,256);
sprintf(buffer,"发送端IP地址:%d.%d.%d.%d",arp->src_addr[0],
arp->src_addr[1],arp->src_addr[2],arp->src_addr[3]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//对方系统MAC地址
memset(buffer,0,256);
sprintf(buffer,"对方系统MAC地址:%02X-%02X-%02X-%02X-%02X-%02X",
arp->des_mac[0],arp->des_mac[1],arp->des_mac[2],arp->des_mac[3],
arp->des_mac[4],arp->des_mac[5]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//对方系统IP地址
memset(buffer,0,256);
sprintf(buffer,"对方系统IP地址:%d.%d.%d.%d",arp->des_addr[0],
arp->des_addr[1],arp->des_addr[2],arp->des_addr[3]);
m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
}*/
void CPacketTreeData::InsertIPTree(PROTOCOL_DEFINE::IP_HEADER * ip,HTREEITEM hItem)
{
char buffer[256];
memset(buffer,0,256);
sprintf(buffer,"IPv%d",(ip->ver_len>>4)&15);
HTREEITEM hIpItem=m_DataTree.InsertItem(_T(buffer),hItem,TVI_LAST );
//版本
memset(buffer,0,256);
sprintf(buffer,"版本:%d",(ip->ver_len>>4)&15);
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//报头长度
memset(buffer,0,256);
sprintf(buffer,"报头长:%d字节",(ip->ver_len&15)*32/8);
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//服务类型
memset(buffer,0,256);
sprintf(buffer,"服务类型:0x%02x",ip->type);
HTREEITEM hType=m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//处理第零位到第二位
int type=ip->type&7;
if(type==0)
m_DataTree.InsertItem(_T("普通"),hType,TVI_LAST);
if(type==1)
m_DataTree.InsertItem(_T("优先"),hType,TVI_LAST);
if(type==2)
m_DataTree.InsertItem(_T("立刻"),hType,TVI_LAST);
if(type==3)
m_DataTree.InsertItem(_T("即时"),hType,TVI_LAST);
if(type==4)
m_DataTree.InsertItem(_T("即时、优先"),hType,TVI_LAST);
if(type==5)
m_DataTree.InsertItem(_T("重要"),hType,TVI_LAST);
if(type==6)
m_DataTree.InsertItem(_T("网络间控制"),hType,TVI_LAST);
if(type==7)
m_DataTree.InsertItem(_T("网络控制"),hType,TVI_LAST);
//处理第三位到第六位
type=(ip->type>>3)&7;
if(type==0)
m_DataTree.InsertItem(_T("普通服务"),hType,TVI_LAST);
if(type==1)
m_DataTree.InsertItem(_T("金钱成本最小"),hType,TVI_LAST);
if(type==2)
m_DataTree.InsertItem(_T("可靠性最大"),hType,TVI_LAST);
if(type==4)
m_DataTree.InsertItem(_T("吞吐量最大"),hType,TVI_LAST);
if(type==8)
m_DataTree.InsertItem(_T("延迟最小"),hType,TVI_LAST);
if(type==15)
m_DataTree.InsertItem(_T("安全级最高"),hType,TVI_LAST);
//数据报长度
memset(buffer,0,256);
sprintf(buffer,"数据报长度:%d字节",ip->length[0]*0x100+ip->length[1]);
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//标识
memset(buffer,0,256);
sprintf(buffer,"标识:%d",ip->id[0]*0x100+ip->id[1]);
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//标志
memset(buffer,0,256);
int flag=ip->flag_offset[0]>>5;
sprintf(buffer,"标志:%d",flag);
HTREEITEM hFlagItem=m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
if((flag&4)==0)
m_DataTree.InsertItem(_T("预约固定"),hFlagItem,TVI_LAST);
if((flag&2)==0)
m_DataTree.InsertItem(_T("有碎块"),hFlagItem,TVI_LAST);
if((flag&1)==0)
m_DataTree.InsertItem(_T("最后的碎块"),hFlagItem,TVI_LAST);
else
m_DataTree.InsertItem(_T("接收中"),hFlagItem,TVI_LAST);
//数据块偏移
memset(buffer,0,256);
sprintf(buffer,"数据块偏移:%d",(ip->flag_offset[0]*0x100+ip->flag_offset[1])&8191);//后13位
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//TTL
memset(buffer,0,256);
sprintf(buffer,"生存时间TTL:%d",ip->time);
m_DataTree.InsertItem(_T(buffer),hIpItem,TVI_LAST);
//协议
memset(buffer,0,256);
switch(ip->protocol)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -