📄 monitordlg.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 + -