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

📄 monitordlg.cpp

📁 协议基础以太网
💻 CPP
字号:
// monitorDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "monitor.h"
#include "monitorDlg.h"
#include "monitordlg.h"

#include "define.h"
#include ".\monitordlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMonitorDlg 对话框



CMonitorDlg::CMonitorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMonitorDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_Thread=NULL;
}

void CMonitorDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CMonitorDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_MONITOR_START, OnMonitorStart)	
	ON_COMMAND(ID_MONITOR_STOP, OnMonitorStop)	
END_MESSAGE_MAP()


// CMonitorDlg 消息处理程序

BOOL CMonitorDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_Sheet.AddPage(&m_MonPackets);
	m_Sheet.AddPage(&m_PacketData);
	m_Sheet.Create(this,WS_VISIBLE|WS_CHILD,WS_EX_DLGMODALFRAME);

	m_Thread=AfxBeginThread(CMonitorDlg::Monitor,this);

	
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CMonitorDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CMonitorDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

UINT CMonitorDlg::Monitor(LPVOID pParam)
{
	CMonitorDlg * pDlg=(CMonitorDlg *)pParam;

	char *ebuf;
	char *myAdapter;

	CString Adapter;

	ebuf=(char*)malloc(PCAP_ERRBUF_SIZE);
	if (Adapter=="")
	{
		//If no adapter is defined choose the first
		myAdapter=(char*)pcap_lookupdev(ebuf);
		DWORD dwVersion=GetVersion();		//get the OS version
		DWORD dwWindowsMajorVersion =  (DWORD)(LOBYTE(LOWORD(dwVersion)));
		if (dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4)// Windows '95
			Adapter=myAdapter;
		else //winNT
			Adapter=(WCHAR *)myAdapter;
		pcap_t *fp=NULL;
		if ( (fp= pcap_open_live((char*)myAdapter, 68, 1, 1000, ebuf) ) == NULL)
		{
			TRACE("PCAP error: Error opening the adapter");
			return FALSE;
		}
		if(pcap_loop(fp,-1,pDlg->parcket_handle,(u_char *)pDlg)<0)
		{
			TRACE1("pcap_loop error: %d\n", pcap_geterr(fp));
			return FALSE;
		}
		pcap_close(fp);
	}
	return 0;
}

//BOOL CMonitorDlg::PreTranslateMessage(MSG* pMsg)
//{
//	// TODO: 在此添加专用代码和/或调用基类
//	if(pMsg->message==WM_KEYDOWN)
//		if(pMsg->wParam == VK_ESCAPE)
//			return FALSE;
//	return CDialog::PreTranslateMessage(pMsg);
//}
void CMonitorDlg::parcket_handle(u_char * user,const struct pcap_pkthdr *h,const u_char * p)
{
	CMonitorDlg * pDlg=(CMonitorDlg *)user;
	//时间

	struct tm * tm=localtime(&h->ts.tv_sec);
	char buffer[256];
	memset(buffer,0,256);
	sprintf(buffer,"%d-%d-%d,%d:%d:%d",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
	pDlg->m_MonPackets.m_PacketsList.InsertItem(0,buffer);

	//保存数据
	byte * data=new byte[h->len];
	memcpy(data,p,h->len);
	pDlg->m_MonPackets.m_PacketsList.SetItemData(0,(DWORD)data);

	//目标MAC地址
	memset(buffer,0,256);
	sprintf(buffer,"%02X-%02X-%02X-%02X-%02X-%02X",p[0],p[1],p[2],p[3],p[4],p[5]);
	pDlg->m_MonPackets.m_PacketsList.SetItemText(0,6,buffer);
	//源MAC地址
	memset(buffer,0,256);
	sprintf(buffer,"%02X-%02X-%02X-%02X-%02X-%02X",p[6],p[7],p[8],p[9],p[10],p[11]);
	pDlg->m_MonPackets.m_PacketsList.SetItemText(0,5,buffer);
	//包的大小
	memset(buffer,0,256);
	sprintf(buffer,"%d",h->len);
	pDlg->m_MonPackets.m_PacketsList.SetItemText(0,9,buffer);
	//包的类型
	memset(buffer,0,256);
	sprintf(buffer,"0x%02X%02X",p[12],p[13]);
	if(strcmp(buffer,IP)==0)//IP数据包
		pDlg->m_MonPackets.InsertIPPacket(p+14);
	else if(strcmp(buffer,ARP)==0)//ARP数据包
	{
		pDlg->m_MonPackets.InsertARPRARPPacket(p+14);
		pDlg->m_MonPackets.m_PacketsList.SetItemText(0,3,"ARP");
	}
	else if(strcmp(buffer,IP)==0)//RARP数据包
	{
		pDlg->m_MonPackets.InsertARPRARPPacket(p+14);
		pDlg->m_MonPackets.m_PacketsList.SetItemText(0,3,"RARP");
	}
	else//不支持的数据包
	{
		pDlg->m_MonPackets.m_PacketsList.SetItemText(0,3,buffer);
	}




}
void CMonitorDlg::OnMonitorStart()
{
	// TODO: 在此添加命令处理程序代码
	if(m_Thread)
	{
		m_Thread->ResumeThread();
	}	
}

void CMonitorDlg::OnMonitorStop()
{
	// TODO: 在此添加命令处理程序代码
	if(m_Thread)
		m_Thread->SuspendThread();

}
BOOL CMonitorDlg::PreTranslateMessage(MSG* pMsg)
{
	// TODO: 在此添加专用代码和/或调用基类
	if(pMsg->message==WM_KEYDOWN)
		if(pMsg->wParam==VK_ESCAPE)
			return FALSE;
	return CDialog::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -