📄 icmpprotocoldlg.cpp
字号:
// ICMPProtocolDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "ICMPProtocol.h"
#include "ICMPProtocolDlg.h"
#include "PingOptDlg.h"
//////////////////////////////////////////////////////////////////////////////
#include "RegKey.h"
#include "SysTCPIP.h"
//////////////////////////////////////////////////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CICMPProtocolDlg 对话框
CICMPProtocolDlg::CICMPProtocolDlg(CWnd* pParent /*=NULL*/)
: CDialog(CICMPProtocolDlg::IDD, pParent)
, m_strHost(_T(""))
, m_strLocalHost(_T(""))
, m_strNameServer(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CICMPProtocolDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_DEST, m_strHost);
DDX_Control(pDX, IDC_TraceList, m_ctlTraceList);
DDX_Text(pDX, IDC_LocalHost, m_strLocalHost);
DDX_Text(pDX, IDC_NameServer, m_strNameServer);
}
BEGIN_MESSAGE_MAP(CICMPProtocolDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_MESSAGE(WSA_PING_ASYNC, OnPINGAsynch)
ON_BN_CLICKED(IDC_PingButton, OnBnClickedPingbutton)
ON_BN_CLICKED(IDC_TraceButton, OnBnClickedTracebutton)
ON_BN_CLICKED(IDC_OptionsButton, OnBnClickedOptionsbutton)
ON_BN_CLICKED(IDC_ClearButton, OnBnClickedClearbutton)
ON_BN_CLICKED(IDC_Stop, OnBnClickedStop)
ON_BN_CLICKED(IDQUIT, OnBnClickedQuit)
END_MESSAGE_MAP()
// CICMPProtocolDlg 消息处理程序
//BOOL CICMPProtocolDlg::OnInitDialog()
//{
// CDialog::OnInitDialog();
//
// // 将\“关于...\”菜单项添加到系统菜单中。
//
// // IDM_ABOUTBOX 必须在系统命令范围内。
// 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);
// }
// }
//
// // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// // 执行此操作
// SetIcon(m_hIcon, TRUE); // 设置大图标
// SetIcon(m_hIcon, FALSE); // 设置小图标
//
// // TODO:在此添加额外的初始化代码
//
// return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
//}
void CICMPProtocolDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CICMPProtocolDlg::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 CICMPProtocolDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//////////////////////////////////////////////////////////////////////////
// //
// BUTTON HANDLING SECTION //
// //
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////
// //
// Issue PING Request //
// //
// Set IconState to default, Set icmpTTL //
// to MaxHops, reset icmpTracing, and //
// issue IcmpPing request. //
// //
//////////////////////////////////////////////
//PING按钮处理程序
void CICMPProtocolDlg::OnBnClickedPingbutton()
{
IconState = 0;
//列表框插入一条空记录
DisplayBlankLine ();
icmpTracing = FALSE;
icmpPingTTL = PingSocket.icmpMaxHops;
PingSocket.icmpCurSeq = 0;
//调用SENDPING函数发送PING 命令
SendPing ( );
}
//////////////////////////////////////////
// //
// Trace Route Request //
// //
// Set icmpPingTTL to 0, icmpHops to //
// 0, set default icon and output //
// message about the target, then //
// issue a PING with icmpTracing set //
// to TRUE to start tracing. //
// //
//////////////////////////////////////////
void CICMPProtocolDlg::OnBnClickedTracebutton()
{
//列表框插入一个空白项
DisplayBlankLine ();
//设定TTL为0
icmpPingTTL = 0;
PingSocket.icmpHops = 0;
//图标状态为0
IconState = 0;
PingSocket.icmpCurSeq = 0;
//设定地址
TraceTarget.s_addr = HostIPAddress();
CString TComment;
TComment.Format("Trace Target = %s",
inet_ntoa(TraceTarget));
//活动TRACE的信息
TraceComment (TComment);
icmpTracing = TRUE;
//调用SendPing函数
SendPing ( );
}
//////////////////////////////////////////
// //
// Set operating options //
// //
// Copy current option settings to //
// interchange variables, invoke //
// options dialog. //
// //
// Exit dialog if option dialog was //
// cancelled. //
// //
// Update current option variables and //
// save in the Registry. //
// //
//////////////////////////////////////////
void CICMPProtocolDlg::OnBnClickedOptionsbutton()
{
CPingOptDlg OptionsDlg;
OptionsDlg.m_nBufferSize = icmpDataLen;
OptionsDlg.m_strDefaultHost = DefHost;
OptionsDlg.m_nPingTimeout = PingSocket.icmpPingTimer;
OptionsDlg.m_nMaxHops = PingSocket.icmpMaxHops;
int Result = OptionsDlg.DoModal();
if (Result != IDOK)
return;
icmpDataLen = OptionsDlg.m_nBufferSize;
DefHost = OptionsDlg.m_strDefaultHost;
PingSocket.icmpPingTimer = OptionsDlg.m_nPingTimeout;
PingSocket.icmpMaxHops = OptionsDlg.m_nMaxHops;
SaveRegValues();
}
//////////////////////////////////////////
// //
// Clear Display List //
// //
// Delete all items from ListCtrl box //
// //
//////////////////////////////////////////
void CICMPProtocolDlg::OnBnClickedClearbutton()
{
if (!PingSent)
m_ctlTraceList.DeleteAllItems();
}
//////////////////////////////////////////
// //
// Stop Current Ping //
// //
//////////////////////////////////////////
void CICMPProtocolDlg::OnBnClickedStop()
{
if (!PingSent)
return;
PingSent = FALSE;
StopTimer();
EndTrace();
m_ctlTraceList.InsertItem (m_ctlTraceList.GetItemCount(),
"",
Icon_BlueArrow);
SetTraceFocus (m_ctlTraceList.GetItemCount()-1,
0);
DisplayTrace ("","","Operation CANCELLED");
}
void CICMPProtocolDlg::OnBnClickedQuit()
{
StopTimer ();
PingSocket.CloseIcmpSocket();
CDialog::OnOK();
}
BOOL CICMPProtocolDlg::OnInitDialog()
{
CDialog::OnInitDialog();
PingSocket.icmpSocket = INVALID_SOCKET;
PingSent = FALSE;
FetchWinsockSettings(); // 获得机器名、域名的属性.
if (!InitSockets()) // 如果初始化失败则退出
CDialog::OnCancel();
InitImageList(); // 设定列表框图标
pIcmpBuffer = (LPSTR)icmpBuffer;// 设定缓冲区
return TRUE; // return TRUE unless you set the focus to a control
// 异常:OCX 属性页应返回 FALSE
}
//////////////////////////////////////////////////////
// //
// PING Asynchronous Message Processor //
// //
// Responds to received ICMP messages //
// Updates the Trace window with the round //
// trip time and sequence, //
// Stops the timer, //
// If not TRACING, exits. //
// //
// If rcvSockAddr = TraceTarget, displays //
// host reached and exits. //
// If icmpMaxHops exceeded, displays host not //
// reached and exits. (icmpMaxHops is set //
// in EWDPing Options Dialog). //
// Displays next animated icon picture, //
// increments icmpHops and requests next //
// PING //
// //
//////////////////////////////////////////////////////
LRESULT CICMPProtocolDlg::OnPINGAsynch(WPARAM wParam, LPARAM lParam)
{
int WSAEvent = WSAGETSELECTEVENT(lParam);
int WSAError = WSAGETSELECTERROR(lParam);
if (WSAError)
{
CString ErrorMessage;
ErrorMessage.Format("WSAAsynch Event # %u, Error: %u",
WSAEvent,
WSAError);
MessageBox (ErrorMessage,
"CICMPProtocolDlg::OnPINGAsynch",
MB_OK|MB_SYSTEMMODAL);
}
StopTimer();
switch (WSAEvent)
{
case FD_READ:
if (PingSocket.Receive(pIcmpBuffer, sizeof icmpBuffer) == SOCKET_ERROR)
{
if (!PingSent)
return 0;
PingSocket.DisplayError ("FD_READ",
"CICMPProtocolDlg::OnWSAAsynch");
}
else
{
DWORD PingRoundTrip = PingSocket.icmpPingReceivedAt - PingSocket.icmpPingSentAt;
if (PingSocket.icmpRoundTripTime > PingRoundTrip)
PingSocket.icmpRoundTripTime = PingRoundTrip;
if (PingSent)
{
UpdateTrace();
if (!icmpTracing)
{
m_ctlTraceList.InsertItem (m_ctlTraceList.GetItemCount(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -