📄 icmpprotocoldlg.cpp
字号:
"",
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 + -