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

📄 icmpprotocoldlg.cpp

📁 实现发送ICMP封包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -