📄 netcapdlg.cpp
字号:
// NetcapDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Netcap.h"
#include "NetcapDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
/////////////////////////////////////////////////////////////////////////////
// CNetcapDlg dialog
CNetcapDlg::CNetcapDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNetcapDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CNetcapDlg)
// NOTE: the ClassWizard will add member initialization here
m_edit=_T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_nCurSel=0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CNetcapDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNetcapDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Control(pDX, IDC_LIST1, m_list);
DDX_Text(pDX, IDC_EDIT1, m_edit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNetcapDlg, CDialog)
//{{AFX_MSG_MAP(CNetcapDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(IDM_EXIT, OnExit)
ON_COMMAND(IDM_START, OnStart)
ON_COMMAND(IDM_STOP, OnStop)
ON_COMMAND(IDM_FILTER, OnFilter)
ON_NOTIFY(NM_CLICK, IDC_CAPTURE_LIST, OnClickCaptureList)
ON_NOTIFY(LVN_KEYDOWN, IDC_CAPTURE_LIST, OnKeydownCaptureList)
ON_COMMAND(IDM_CLEAR_LIST, OnClearList)
ON_COMMAND(IDM_DELETE_ITEM, OnDeleteItem)
//}}AFX_MSG_MAP
ON_MESSAGE(MSG_RECEIVE, OnReceive)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNetcapDlg message handlers
BOOL CNetcapDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
if(!m_wndToolBar.Create(this))
{
return FALSE;
}
if(!m_wndToolBar.LoadToolBar(IDR_TOOLBAR))
{
EndDialog(IDCANCEL);
return FALSE;
}
CString strLables[] =
{
TEXT("时间"),
TEXT("长度"),
TEXT("TTL"),
TEXT("协议"),
TEXT("源地址"),
TEXT("目的地址"),
};
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
lvc.fmt=LVCFMT_LEFT;
lvc.pszText=(char *)(LPCTSTR)strLables[0];
lvc.cx=strLables[0].GetLength()*18;
m_list.InsertColumn(0, &lvc);
for(int i=1; i<6; i++)
{
lvc.iSubItem=i;
lvc.pszText=(char *)(LPCTSTR)strLables[i];
lvc.cx=strLables[i].GetLength()*18;
m_list.InsertColumn(i, &lvc);
}
CRect rcTB;
CWnd* PWnd=GetDlgItem(IDC_TB);
PWnd->GetWindowRect(&rcTB);
this->ScreenToClient(&rcTB);
m_wndToolBar.MoveWindow(&rcTB,FALSE);
m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP,MAKELONG(TBSTATE_INDETERMINATE, 0));
return TRUE;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CNetcapDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
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;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
void CNetcapDlg::OnExit()
{
m_listener.StopListen();
OnClearList();
EndDialog(IDOK);
}
static char *szProto[] = {"Reserved", "ICMP", "IGMP", "GGP", "IP", "ST", "TCP",
"UCL", "EGP", "IGP", "BBN-RCC-MON", "NVP-II", "PUP",
"ARGUS", "EMCON", "XNET", "CHAOS", "UDP", "MUX",
"DCN-MEAS", "HMP", "PRM", "XNS-IDP", "TRUNK-1", "TRUNK-2",
"LEAF-1", "LEAF-2", "RDP", "IRTP", "ISO-TP4", "NETBLT",
"MFE-NSP", "MERIT-INP", "SEP", "3PC", "IDPR", "XTP", "DDP",
"IDPR-CMTP", "TP++", "IL", "SIP", "SDRP", "SIP-SR",
"SIP-FRAG", "IDRP", "RSVP", "GRE", "MHRP", "BNA", "SIPP-ESP",
"SIPP-AH", "I-NLSP", "SWIPE", "NHRP", "unassigned", "unassigned",
"unassigned", "unassigned", "unassigned", "unassigned",
"any host internal protocol", "CFTP", "any local network",
"SAT-EXPAK", "KRYPTOLAN", "RVD", "IPPC", "any distributed file system",
"SAT-MON", "VISA", "IPCV", "CPNX", "CPHB", "WSN", "PVP",
"BR-SAT-MON", "SUN-ND", "WB-MON", "WB-EXPAK", "ISO-IP", "VMTP",
"SECURE-VMTP", "VINES", "TTP", "NSFNET-IGP", "DGP", "TCF", "IGRP",
"OSPFIGP", "Sprite-RPC", "LARP", "MTP", "AX.25", "IPIP", "MICP",
"SCC-SP", "ETHERIP", "ENCAP", "any private encryption scheme", "GMTP"
};
void CNetcapDlg::OnReceive(WPARAM, LPARAM lParam)
{
int tt=sizeof(szProto)/sizeof(char *);
LONGLONG llFilter;
WSABUF* pBuf=(WSABUF *)lParam;
UCHAR* buf = (UCHAR *)pBuf->buf;
ASSERT(pBuf->len >= 20);
ULONG IP=(buf[12]<<24)|(buf[13]<<16)|(buf[14]<<8)|buf[15];
llFilter=m_dlgFilter.GetSourceIPFilter();
if(llFilter != 0xFFFFFFFFF)
{
if(IP != (llFilter & 0xFFFFFFFFF))
{
return;
}
}
IP = (buf[16]<<24)|(buf[17]<<16)|(buf[18]<<8)|buf[19];
llFilter=m_dlgFilter.GetDestIPFilter();
if(llFilter != 0xFFFFFFFFF)
{
if(IP != (llFilter & 0xFFFFFFFFF))
{
return;
}
}
buf = (UCHAR *)::GlobalAlloc(GPTR, pBuf->len);
memcpy(buf,pBuf->buf, pBuf->len);
WSABUF *pbuf=new WSABUF;
pbuf->buf = (char *)buf;
pbuf->len = pBuf->len;
CString strItem;
int nIndex = m_list.GetItemCount();
CTime t = CTime::GetCurrentTime();
strItem.Format("%02d:%02d:%02d",t.GetHour(),t.GetMinute(),t.GetSecond());
m_list.InsertItem(nIndex, strItem, -1);
strItem.Format("%d",pBuf->len);
m_list.SetItemText(nIndex,2,strItem);
strItem.Format("%d",buf[8]);
m_list.SetItemText(nIndex,2,strItem);
if(buf[9]>99)
strItem = _T("IP/UNKNOWN");
else
strItem = szProto[buf[9]];
m_list.SetItemText(nIndex, 3, strItem);
strItem.Format("%d.%d.%d.%d",buf[12],buf[13],buf[14],buf[15]);
m_list.SetItemText(nIndex, 4, strItem);
strItem.Format("%d.%d.%d.%d",buf[16],buf[17],buf[18],buf[19]);
m_list.SetItemText(nIndex, 5, strItem);
m_list.SetItemText(nIndex, 6, strItem);
m_list.SetItemData(nIndex, (DWORD)pbuf);
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
//开始捕获
void CNetcapDlg::OnStart()
{
if(m_listener.StartListen ())
{
CMenu* pMenu = GetMenu();
CMenu* pSub = pMenu->GetSubMenu(0);
pSub->EnableMenuItem(IDM_START, MF_GRAYED);
pSub->EnableMenuItem(IDM_STOP,MF_ENABLED);
m_wndToolBar.SendMessage(TB_SETSTATE, IDM_START, MAKELONG(TBSTATE_PRESSED|TBSTATE_INDETERMINATE, 0));
m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP, MAKELONG(TBSTATE_ENABLED,0));
}
else
{
MessageBox(TEXT("failed to start capture!"),TEXT("Error"),MB_OK);
}
}
void CNetcapDlg::OnStop()
{
m_listener.StopListen();
CMenu* pMenu = GetMenu();
CMenu* pSub = pMenu->GetSubMenu(0);
pSub->EnableMenuItem(IDM_STOP, MF_GRAYED);
pSub->EnableMenuItem(IDM_START, MF_ENABLED);
m_wndToolBar.SendMessage(TB_SETSTATE, IDM_STOP,MAKELONG(TBSTATE_INDETERMINATE,0));
m_wndToolBar.SendMessage(TB_SETSTATE, IDM_START, MAKELONG(TBSTATE_ENABLED, 0));
}
//set filter
void CNetcapDlg::OnFilter()
{
m_dlgFilter.DoModal();
}
//当某个栏目被点中时,我们应该选择的索引
void CNetcapDlg::OnClickCaptureList(NMHDR* pNMHDR, LRESULT* pResult)
{
if(pNMHDR->idFrom==IDC_CAPTURE_LIST)
{
POSITION pos = m_list.GetFirstSelectedItemPosition();
do
{
if(NULL==pos)
break;
if(m_nCurSel==pos)
break;
m_nCurSel = pos;
OnSelectionChanged();
}
while(FALSE);
}
*pResult = 0;
}
//在文本编辑控制里显示16进制
void CNetcapDlg::OnSelectionChanged()
{
WSABUF *pBuf = (WSABUF *)m_list.GetItemData((int)m_nCurSel - 1);
CString str;
TCHAR *strBuf;
UCHAR *p = (UCHAR *)pBuf->buf;
strBuf=str.GetBuffer(((pBuf->len >> 4) + 1) * 60);
for(int i = 0; i < (int) pBuf->len >> 4; i++)
{
for (int j=0; j<16; j++)
{
strBuf+= sprintf(strBuf, "%02X ", *p++ );
if(j==7)
{
*strBuf++='-';
*strBuf++=' ';
}
}
*strBuf++=_T('\r');
*strBuf++=_T('\n');
}
for(i <<= 4; i< (int)pBuf->len; i++)
{
strBuf += sprintf(strBuf, "%02X ", *p++);
if(0 == (i + 1)% 8)
{
*strBuf++ = '-';
*strBuf++ = '-';
}
}
*strBuf = '\0';
str.ReleaseBuffer();
GetDlgItem(IDC_HEXVIEW)->SetWindowText(str);
}
//当 ->,<-,pgUp, PgDw 被按下,我们应该对可选项作出变化
void CNetcapDlg::OnKeydownCaptureList(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_KEYDOWN* pLVKeyDow = (LV_KEYDOWN*)pNMHDR;
*pResult = 0;
if(pNMHDR->idFrom == IDC_CAPTURE_LIST)
{
switch(pLVKeyDow->wVKey)
{
case VK_UP:
if((int)m_nCurSel == 0)
return;
m_nCurSel--;
break;
case VK_DOWN:
m_nCurSel++;
break;
case VK_PRIOR:
m_nCurSel -= m_list.GetCountPerPage();
break;
case VK_NEXT:
m_nCurSel = (POSITION)m_list.GetCountPerPage();
break;
default:
return;
}
if((int)m_nCurSel <= 0)
m_nCurSel = (POSITION)1;
if((int)m_nCurSel > m_list.GetItemCount())
m_nCurSel = (POSITION)m_list.GetItemCount();
OnSelectionChanged();
}
//清空列表
void CNetcapDlg::OnClearList()
{
// TODO: Add your command handler code here
int nCount = m_list.GetItemCount();
WSABUF *pBuf;
for(int i = 0; i< nCount; i++)
{
pBuf = (WSABUF *)m_list.GetItemData(i);
::GlobalFree(pBuf->buf);
delete pBuf;
}
m_list.DeleteAllItems();
m_nCurSel = NULL;
GetDlgItem(IDC_HEXVIEW)->SetWindowText(_T(""));
}
void CNetcapDlg::OnDeleteItem()
{
// TODO: Add your command handler code here
if(m_nCurSel != NULL)
{
int nIndex = (int)m_nCurSel - 1;
WSABUF *pBuf = (WSABUF *)m_list.GetItemData(nIndex);
::GlobalFree(pBuf->buf);
delete pBuf;
m_list.SetItemData(nIndex, (DWORD)0);
m_list.DeleteItem(nIndex);
m_nCurSel--;
if(0==m_list.GetItemCount())
{
GetDlgItem(IDC_HEXVIEW)->SetWindowText(_T(""));
return;
}
if((int)m_nCurSel <= 0)
m_nCurSel = (POSITION)1;
OnSelectionChanged();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -