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

📄 packettreedata.cpp

📁 网络实验网络实验网络实验网络实验网络实验
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -