void InitImageList();
int AddListColumn(int column, int lfmt, int lmaxwidth, LPSTR ltext, int lsubitem); void DisplayBlankLine(void);
void SetTraceSequence(int Seq, int FocusItem, ImageType FocusImage); void SetTraceFocus(int FocusItem, int FocusSubItem);
void SetDisplayImage(int FocusItem, enum ImageType FocusImage); void TraceComment(CString Comment);
public:
CPingPlusDlg(CWnd* pParent = NULL); // 标准构造器
protected:
HICON m_hIcon;
LRESULT OnPINGAsynch(WPARAM wParam, LPARAM lParam);
public: CIcmp
PingSocket;
// Icmp 对象
WSADATA wsaData; // Windows Socket 信息结构 CString LocalNameServer; CString LocalDomainName; CString
DefHost;
// 域名 (从注册机构获取) // 默认主机名 (从注册机构获取)
// 将主机名加入到会话中去
char HostName[MAXHOSTNAME];
char CurrentHostName[MAXHOSTNAME]; // 当前正在ping的主机 struct in_addr TraceTarget; BOOL TimerActive; unsigned long unsigned long char LPSTR int int BOOL BOOL
// 操作路径终端
// TRUE = 计时器到时
icmpIntervalCount; // 当前计时时间间距 icmpMaxIntervals; // 最大间距
icmpBuffer[MAX_PACKET]; // icmp操作的普通缓冲区 pIcmpBuffer;
// icmp缓冲区的故障分析报告指向
icmpDataLen; icmpPingTTL;
// icmp发出信息的字节数 (不计算头部) // 路径操作所用到的ttl值
icmpTracing;// TRUE = 路径操作, FALSE = PING操作 PingSent; // TRUE = 等待ECHO回复, FALSE = 忽略输入
8
};
四、程序主题功能设计模块 1、调用ping模块
void CPingPlusDlg::OnPingButton() {
IconState = 0; DisplayBlankLine (); icmpTracing = FALSE;
icmpPingTTL = PingSocket.icmpMaxHops; //ping生存时间为最大icmp跳数
PingSocket.icmpCurSeq = 0;//当前icmp序列为0 }
SendPing ( );//开始执行ping
2、初始化socket
BOOL CPingPlusDlg::InitSockets() {
if (!PingSocket.OpenNewSocket(GetSafeHwnd(),
{ }
PingSocket.DisplayError (\
\
WSA_PING_ASYNC, FD_READ | FD_WRITE, AF_INET, SOCK_RAW, IPPROTO_ICMP))
return FALSE;
9
}
return TRUE;
3、获取winsocket设置信息
BOOL CPingPlusDlg::FetchWinsockSettings() {
SysTCPIP
STcpIp;
if (!STcpIp.WinsockVersion(&wsaData))
{ }
MessageBox (\
\MB_OK|MB_SYSTEMMODAL);
return FALSE;
if (!STcpIp.GetLocalHostName (&m_LocalHost))
{
gethostname(CurrentHostName, MAXHOSTNAME);
} else { }
m_LocalHost = CurrentHostName;
if (!STcpIp.GetDomainName(&LocalDomainName))
LocalDomainName = \
memcpy (CurrentHostName, m_LocalHost, m_LocalHost.GetLength()); CurrentHostName[m_LocalHost.GetLength()] = 0;
m_LocalHost += \
memcpy (CurrentHostName, m_LocalHost, m_LocalHost.GetLength()); CurrentHostName[m_LocalHost.GetLength()] = 0;
10
if (!STcpIp.GetNSName (&LocalNameServer))
LocalNameServer = \
m_NameServer = \
SetDlgItemText (IDC_LocalHost, m_LocalHost); SetDlgItemText (IDC_NameServer, m_NameServer);
LoadRegValues();
SetDlgItemText (IDC_DEST, HostName); return TRUE; }
4、发送ping信息
void CPingPlusDlg::SendPing(void) {
PingSent = TRUE;
PingSocket.icmpCurSeq++;
PingSocket.icmpCurId = (USHORT)GetCurrentProcessId();
PingSocket.icmpHostAddress = HostIPAddress();
if (PingSocket.icmpHostAddress == NULL)
return;
if (icmpTracing) {
icmpPingTTL++; }
if (PingSocket.SetTTL (icmpPingTTL) == SOCKET_ERROR)
{ PingSocket.DisplayError (\
}
\
return;
Sleep (100);// 用蓝色箭头显示序列号及相应信息
SetTraceSequence (PingSocket.icmpCurSeq,
m_TraceList.GetItemCount(),
11
相关推荐: