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

📄 icmpprotocoldlg.cpp

📁 实现发送ICMP封包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
											"", 
											Icon_BlueArrow);
					SetTraceFocus (m_ctlTraceList.GetItemCount()-1,
								   0);
					DisplayTrace ("","","Host Reached");

				}
			}
		}

		PingSent = FALSE;
		
		if (icmpTracing)
		{
			PingSocket.icmpHops++;
			if ( (PingSocket.icmpHops >= PingSocket.icmpMaxHops) ||
				 (TraceTarget.s_addr == PingSocket.rcvSockAddr.sin_addr.s_addr ))
			{
				EndTrace();
				m_ctlTraceList.InsertItem (m_ctlTraceList.GetItemCount(), 
										"", 
										Icon_BlueArrow);
				SetTraceFocus (m_ctlTraceList.GetItemCount()-1,
							   0);
				DisplayTrace ("","","HOST Reached");
			}
			else
			{
				ChangeIconState();
				SendPing();
			}
		}

		break;

	case FD_WRITE:
		break;

	default:
		break;

	}

	return 0;
}

//////////////////////////////////////////////////////
//													//
//					End Trace Operation				//
//													//
//		Set ICON to default, and force screen to	//
//		be updated.  Reset icmpTracing so next		//
//		operation will be PING.						//
//													//
//////////////////////////////////////////////////////
void CICMPProtocolDlg::EndTrace(void)
{
	CStatic *	pDlgWnd;

	m_hIcon = AfxGetApp()->LoadIcon(IDI_CommLink1);		

	pDlgWnd=(CStatic*)GetDlgItem(IDC_CommLink);
	pDlgWnd->SetIcon(m_hIcon);						

	if(IsIconic())
	{
		InvalidateRect(NULL,TRUE);
	}

	icmpTracing = FALSE;

}

//////////////////////////////////////////////////////////////////////////
//																		//
//								TIMER SECTION							//
//																		//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////
//															//
//				Process Timer Interrupt						//
//															//
//		If time-out period has not elapsed, increment		//
//		icmpIntervalCount, change the animated icon's state	//
//		and exit.											//
//															//
//		Otherwise, stop the timer, reset icon to default,	//
//		set receive address to null, and update the trace	//
//		display to show that the timer has expired.			//
//															//
//////////////////////////////////////////////////////////////

//计时器事件
void CICMPProtocolDlg::OnTimer(UINT id)
{

	CString		Message;
	CStatic *	pDlgWnd;
	//如果没有超时则不断改变图标状态,并将计时变量增加
	if (icmpIntervalCount < icmpMaxIntervals)
	{
		ChangeIconState ();
		icmpIntervalCount++;
		return;
	}

	StopTimer();
	PingSent = FALSE;

	m_hIcon = AfxGetApp()->LoadIcon(IDI_CommLink1);		

	pDlgWnd=(CStatic*)GetDlgItem(IDC_CommLink);
	pDlgWnd->SetIcon(m_hIcon);						

	if(IsIconic()) 
	{
		InvalidateRect(NULL,TRUE);
	}

	PingSocket.rcvSockAddr.sin_addr.s_addr = NULL;
	
	PingSocket.icmpRoundTripTime = PingSocket.icmpPingTimer * icmpMaxIntervals;
	UpdateTrace ();

	if (icmpTracing)
		SendPing();
}

//////////////////////////////////////////
//										//
//			Start the Timer				//
//										//
//	Start the timer and set TimerActive	//
//										//
//////////////////////////////////////////
void CICMPProtocolDlg::StartTimer()
{

	TimerActive = FALSE;
	
	icmpIntervalCount = 0;
	icmpMaxIntervals = (PingSocket.icmpPingTimer / MAX_INTERVAL_TIME);

	TimerNumber = SetTimer(IDT_TIMER1, MAX_INTERVAL_TIME, NULL);
	if (TimerNumber != 0)
		TimerActive = TRUE;
	
	return;

}

//////////////////////////////////////////////
//											//
//				Stop the Timer				//
//											//
//	Issue KillTimer and reset TimerActive	//
//											//
//////////////////////////////////////////////
void CICMPProtocolDlg::StopTimer()
{

	if (TimerActive)
		KillTimer (TimerNumber);
	TimerActive = FALSE;
}

//////////////////////////////////////////////////
//												//
//				Change Icon State				//
//												//
//		Select the next icon image to display	//
//		increment the IconState and invoke		//
//		icon display							//
//												//
//////////////////////////////////////////////////

void CICMPProtocolDlg::ChangeIconState(void)
{
	int			IconId;
	CStatic *	pDlgWnd;

	switch (IconState % 4)
	{
	case 0:
		IconId = IDI_CommLink2;
		break;
	case 1:
		IconId = IDI_CommLink3;
		break;
	case 2:
		IconId = IDI_CommLink4;
		break;
	case 3:
		IconId = IDI_CommLink3;
		break;
	default:
		IconId = IDI_CommLink1;
		break;
	}
	
	IconState++;

	m_hIcon = AfxGetApp()->LoadIcon(IconId);		

	pDlgWnd=(CStatic*)GetDlgItem(IDC_CommLink);
	pDlgWnd->SetIcon(m_hIcon);						

	if(IsIconic())
	{
		InvalidateRect(NULL,TRUE);
	}

}


//////////////////////////////////////////////////////////////////////////
//																		//
//							SOCKET SUPPORT SECTION						//
//																		//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////
//												//
//			Send a PING Message					//
//												//
//		Sends a PING message to the currently	//
//		selected host.							//
//												//
//		If icmpTracing is TRUE,					//
//			increment and set icmpPingTTL to	//
//			reach the next node in the Internet //
//			tree. Note: must timeout for a small//
//			period of time to allow TTL to		//
//			complete.							//
//												//
//		Start the timer and issue the Icmp Ping	//
//												//
//////////////////////////////////////////////////

//发送PING消息包到目的主机
void CICMPProtocolDlg::SendPing(void)
{

	PingSent = TRUE;
	PingSocket.icmpCurSeq++;
	PingSocket.icmpCurId = (USHORT)GetCurrentProcessId();

	PingSocket.icmpHostAddress = HostIPAddress();
	
	//如果目标地址为空,则返回
	if (PingSocket.icmpHostAddress == NULL)
		return;
	//如果icmpTracing为真,则必须将
	if (icmpTracing)
	{
		icmpPingTTL++;
	
    }
	//设定TTL
	if (PingSocket.SetTTL (icmpPingTTL) == SOCKET_ERROR)
	{
		PingSocket.DisplayError ("setsocket(TTL)",
								 "CICMPProtocolDlg::SendPing");
		return;
	}
	//要设定一定的时间让TTL设定完成
	Sleep (100);
	
	//显示序列号,同时用蓝色尖头表示出来
	SetTraceSequence (PingSocket.icmpCurSeq, 
					  m_ctlTraceList.GetItemCount(), 
					  Icon_BlueArrow);

	//设定地址
	PingSocket.icmpSockAddr.sin_family = PF_INET;
	PingSocket.icmpSockAddr.sin_addr.s_addr = PingSocket.icmpHostAddress;
	PingSocket.icmpSockAddr.sin_port = 0;
	//开始计时
	StartTimer();
	//调用PING函数发出PING命令
	if (PingSocket.Ping (pIcmpBuffer, icmpDataLen) == SOCKET_ERROR)
		PingSocket.DisplayError("Ping", "CICMPProtocolDlg::SendPing");

}

//////////////////////////////////////////////////////
//													//
//					HostIPAddress					//
//													//
//		Return the IP Address for the curently		//
//		selected host in Internet byte order.		//
//													//
//		GetIPAddress leaves a copy of the address	//
//		in icmpSockAddr and sets HostName to its	//
//		DNS official name.							//
//													//
//////////////////////////////////////////////////////
unsigned long CICMPProtocolDlg::HostIPAddress()
{

	unsigned long		iHostAddress;

	GetDlgItemText (IDC_DEST, HostName, MAXHOSTNAME);

	iHostAddress = PingSocket.GetIPAddress ((LPSTR)&HostName);

	if ((iHostAddress == INADDR_ANY) || (iHostAddress == NULL))
	{
		PingSocket.DisplayError ("gethostbyname", 
								 "CICMPProtocolDlg::HostIPAddress");
		iHostAddress = NULL;
	}
	
	else
		
		SetDlgItemText (IDC_DEST, HostName);

	return iHostAddress;
}


//////////////////////////////////////////////////////////////////////////
//																		//
//					CListCtrl and Image List Sections					//
//																		//
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////
//										//
//		Initialize Image Lists			//
//										//
//	The small image list is used, the	//
//	large is not, but is initialized	//
//	anyhow since they exist.			//
//										//
//////////////////////////////////////////
void CICMPProtocolDlg::InitImageList()
{

	//
	//		Create the image lists and add the icons
	//

	smallImageList.Create(16,16,FALSE,1,1);
	largeImageList.Create(32,32,FALSE,1,1);

	HICON TIcon;
	
	TIcon = LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_Blank));
	smallImageList.Add (TIcon);
	largeImageList.Add (TIcon);

	TIcon = LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDI_BlueArrow));
	smallImageList.Add (TIcon);
	largeImageList.Add (TIcon);

	//
	//		Assign the image lists to the list view
	//
	m_ctlTraceList.SetImageList (&largeImageList, LVSIL_NORMAL);
	m_ctlTraceList.SetImageList (&smallImageList, LVSIL_SMALL);
	
	//
	//		Initialize the columns and headings
	//
	AddListColumn (0, 
				   LVCFMT_CENTER, 
				   m_ctlTraceList.GetStringWidth("SEQXX")+12, 
				   "序号",
				   0);
	AddListColumn (1, 
				   LVCFMT_CENTER, 
				   m_ctlTraceList.GetStringWidth("TIMEXX")+12, 
				   "时间",
				   1);
	AddListColumn (2, 
				   LVCFMT_CENTER, 
				   m_ctlTraceList.GetStringWidth("255.255.255.255.1")+10, 
				   "IP地址",
				   2);
	AddListColumn (3, 
				   LVCFMT_CENTER, 
				   m_ctlTraceList.GetStringWidth("XXXXXXXXEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"), 
				   "信息", 
				   3);

}

//////////////////////////////////////////////
//											//
//		Create Column Headings/Widths		//
//											//
//////////////////////////////////////////////
int CICMPProtocolDlg::AddListColumn(int lcolumn, int lfmt, int lmaxwidth, LPSTR ltext, int lsubitem)
{

	LV_COLUMN		lColumn;

	lColumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
	lColumn.fmt = lfmt;
	lColumn.cx = lmaxwidth;
	lColumn.pszText = ltext;
	lColumn.cchTextMax = sizeof (ltext);
	lColumn.iSubItem = lsubitem;

	int colno = m_ctlTraceList.InsertColumn (lcolumn, &lColumn);

⌨️ 快捷键说明

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