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

📄 monitorpackets.cpp

📁 协议基础以太网
💻 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 + -