📄 pingthread.cpp
字号:
}
Icmp_Close(PingSocket);
return TRUE;
}
BOOL CPingThread::ProcessReply(CPingThreadParmList *lppingvars,
struct icmp_reply *lpReply)
{
struct in_addr convaddr;
struct hostent *resolve_addr;
CHAR *szTempName;
CHAR szHost[MAXHOSTSIZE];
CHAR szLBLine[LBLINESIZE];
UCHAR RETSpace[3+4*PING_NROUTES+1];
int NumberOfAddresses;
UCHAR *routes;
u_long holdaddr,holdtime;
int x;
int count;
if (lpReply->Status != IP_SUCCESS)
if (lpReply->Status == IP_REQ_TIMED_OUT)
{
PrintLine("Request Timed Out",lppingvars);
return TRUE;
}
else
if (lpReply->Status > IP_UNLOAD)
{
wsprintf(szLBLine,"Ping: Error - Status = %ld",
lpReply->Status);
PrintLine(szLBLine,lppingvars);
return FALSE;
}
else
{
u_long errtab;
errtab = lpReply->Status - IP_STATUS_BASE;
wsprintf(szLBLine,"Ping: Error - Status = %ld %s",
lpReply->Status,
ErrorCodes[errtab].msg);
PrintLine(szLBLine,lppingvars);
return FALSE;
}
convaddr.s_addr = lpReply->Address;
szTempName = inet_ntoa(convaddr);
if (szTempName)
strcpy(szHost,szTempName);
else
strcpy(szHost,"Unknown Address");
if (lppingvars->opt_resolve)
{
resolve_addr = gethostbyaddr((char*)&lpReply->Address,
4,AF_INET);
if (resolve_addr)
wsprintf(szLBLine,
"Ping: Reply from %s [%s] Time %ld ms TTL %u Size %u",
resolve_addr->h_name,
szHost,
lpReply->RoundTripTime,
lpReply->Options.Ttl,
lppingvars->opt_packetlen_val);
else
wsprintf(szLBLine,
"Ping: Reply from %s [Unknown] Time %ld ms TTL %u Size %u",
szHost,
lpReply->RoundTripTime,
lpReply->Options.Ttl,
lppingvars->opt_packetlen_val);
}
else
{
wsprintf(szLBLine,
"Ping: Reply from %s Time %ld ms TTL %u Size %u",
szHost,
lpReply->RoundTripTime,
lpReply->Options.Ttl,
lppingvars->opt_packetlen_val);
}
PrintLine(szLBLine,lppingvars);
if (lppingvars->opt_rroute_val != 0) // Record Route?
{
count = (int)lpReply->Options.OptionsData[IPOPT_OLEN];
memset(RETSpace,0,sizeof(RETSpace));
for (x=0;x<count;x++)
{
RETSpace[x] = lpReply->Options.OptionsData[x];
}
if (RETSpace[IPOPT_OFFSET] > IPOPT_MINOFF)
{
NumberOfAddresses =
((RETSpace[IPOPT_OFFSET] - 4)
/ 4);
routes = RETSpace+3;
for(x=0;x<NumberOfAddresses;x++)
{
// ensure holdaddr will remain in network
// order while the UCHAR data is converted
// to u_long
holdaddr = (*routes<<24) | (*(routes+1)<<16) |
(*(routes+2)<<8) | *(routes+3);
holdaddr = ntohl(holdaddr);
convaddr.s_addr = holdaddr;
szTempName = inet_ntoa(convaddr);
strcpy(szHost,szTempName);
if (lppingvars->opt_resolve)
{
resolve_addr = gethostbyaddr((char*)&holdaddr,
4,AF_INET);
if (resolve_addr)
wsprintf(szLBLine,"Ping: Reply Route %s [%s]",
resolve_addr->h_name,
szHost);
else
wsprintf(szLBLine,"Ping: Reply Route %s [Unkown]",
szHost);
}
else
{
wsprintf(szLBLine,"Ping: Reply Route %s",
szHost);
}
PrintLine(szLBLine,lppingvars);
routes = routes + 4;
}
}
else
{
PrintLine("No Routes Recorded",lppingvars);
}
}
// timestamp option
if (lppingvars->opt_timestamp_val != 0) // Timestamp?
{
count = (int)lpReply->Options.OptionsData[IPOPT_OLEN];
memset(RETSpace,0,sizeof(RETSpace));
for (x=0;x<count;x++)
{
RETSpace[x] = lpReply->Options.OptionsData[x];
}
if (RETSpace[IPOPT_OFFSET] > IPOPT_MINOFF)
{
NumberOfAddresses =
((RETSpace[IPOPT_OFFSET] - 5)
/ 8);
routes = RETSpace+4;
for(x=0;x<NumberOfAddresses;x++)
{
// ensure holdaddr will remain in network
// order while the UCHAR data is converted
// to u_long
holdaddr = (*routes<<24) | (*(routes+1)<<16) |
(*(routes+2)<<8) | *(routes+3);
holdaddr = ntohl(holdaddr);
convaddr.s_addr = holdaddr;
szTempName = inet_ntoa(convaddr);
strcpy(szHost,szTempName);
holdtime = (*(routes+4)<<24) | (*(routes+5)<<16) |
(*(routes+6)<<8) | *(routes+7);
holdtime = ntohl(holdtime);
if (lppingvars->opt_resolve)
{
resolve_addr = gethostbyaddr((char*)&holdaddr,
4,AF_INET);
if (resolve_addr)
wsprintf(szLBLine,
"Ping: Route %s [%s] TS %lu",
resolve_addr->h_name,
szHost,
holdtime);
else
wsprintf(szLBLine,
"Ping: Route %s [Unknown] TS %lu",
szHost,
holdtime);
}
else
{
wsprintf(szLBLine,"Ping: Route %s TS %lu",
szHost,holdtime);
}
PrintLine(szLBLine,lppingvars);
routes = routes + 4;
}
}
else
{
PrintLine("No Routes Recorded",lppingvars);
}
}
return TRUE;
}
void CPingThread::PrintLine(LPSTR szMsg,CPingThreadParmList *lppingvars)
{
//CString m_errmsg;
//CHAR *pm_errmsg;
//pm_errmsg = m_errmsg.GetBuffer(LBLINESIZE+1);
//strcpy(pm_errmsg,szMsg);
//m_errmsg.ReleaseBuffer();
//m_PingOutPut.Add(m_errmsg);
::SendMessage(lppingvars->m_hwndNotifyPingDone,
WM_USER_PING_PRINT, 0, (LONG)szMsg);
return;
}
CPingThread::CPingThread(CPingThreadParmList *lpPingvars)
{
//
// Init ourselves
//
lpPingvars->m_mythread = this;
m_bAutoDelete = FALSE;
m_pThreadParams = lpPingvars;
m_pfnThreadProc = CPingThreadProc;
}
BOOL CPingThread::RunTracert(CPingThreadParmList *lppingvars)
{
BOOL Sendok;
UINT MaxTtl = 30;
UINT probecnt = 3;
struct hostent *resolve_addr;
CHAR szLBLine[LBLINESIZE];
ULONG Timestamp;
CHAR *szTempName;
CHAR szHost[MAXHOSTSIZE];
struct in_addr convaddr;
struct ipopt_info IpoptInfo;
struct ipopt_info *lpIpoptInfo;
struct icmp_reply *EchoReply;
// get rid of these below/
IPAddr SendToAddr;
CHAR achINBuf[PNGINBUFSIZE];
CHAR achOUTBuf[PNGOUTBUFSIZE];
PingSocket = Icmp_Open();
if (PingSocket == 0)
{
PrintLine("Ping: Error - ICMP Open Failed",lppingvars);
return FALSE;
}
SendToAddr = GetAddr(lppingvars->hostname);
EchoReply = (struct icmp_reply *)achINBuf;
bKill = FALSE;
lpIpoptInfo = &IpoptInfo;
memset(lpIpoptInfo,0,IPOPT_INFO_LEN);
convaddr.s_addr = SendToAddr;
// convert addr to dotted
szTempName = inet_ntoa(convaddr);
if (szTempName)
strcpy(szHost,szTempName);
else
strcpy(szHost,"Unknown Address");
// set ttl defaults or values
// set timeout defaults and values
if (lppingvars->opt_timeout_val == 0) // Timeout value specified?
{
//set default timeout
lppingvars->opt_timeout_val = 5000;
}
if (lppingvars->opt_ttl_val == 0) // Timeout value specified?
{
//set default timeout
lppingvars->opt_ttl_val = 30;
}
MaxTtl = lppingvars->opt_ttl_val;
// print the report header
if (lppingvars->opt_resolve)
{
resolve_addr = gethostbyaddr((char*)&SendToAddr,
4,AF_INET);
if (resolve_addr)
wsprintf(szLBLine,
"Tracing: %s [%s] TTL %u Size %u",
resolve_addr->h_name,
szHost,
MaxTtl,
lppingvars->opt_packetlen_val);
else
wsprintf(szLBLine,
"Tracing: %s [Unkown] TTL %u Size %u",
lppingvars->hostname,
MaxTtl,
lppingvars->opt_packetlen_val);
}
else
{
wsprintf(szLBLine,
"Tracing: %s TTL %u Size %u",
lppingvars->hostname,
MaxTtl,
lppingvars->opt_packetlen_val);
}
PrintLine(szLBLine,lppingvars);
//
// ttl loop
//
for (INT x = 1;x <= lppingvars->opt_ttl_val;x++)
{
lpIpoptInfo->Ttl = x;
//
// probe loop
//
for (UINT y = 1;y<=probecnt;y++)
{
if (bKill)
{
PrintLine("Ping Interrupted!",lppingvars);
return FALSE;
}
Timestamp = GetTickCount();
Sendok = Icmp_Sendto(lppingvars,achOUTBuf,achINBuf,
lpIpoptInfo,SendToAddr,
PNGOUTBUFSIZE,
PNGINBUFSIZE);
if (!TracertReply(lppingvars,
(struct icmp_reply *)achINBuf,
x,y,
Timestamp))
{
Icmp_Close(PingSocket);
return FALSE;
}
if (x > 1 && EchoReply->Address == SendToAddr && y == probecnt)
{
x = MaxTtl + 1;
}
}
}
return TRUE;
}
BOOL CPingThread::TracertReply(CPingThreadParmList *lppingvars,
struct icmp_reply *lpReply,
UINT ttl,
UINT probe,
ULONG Timestamp)
{
CHAR *szTempName;
CHAR szHost[MAXHOSTSIZE];
struct in_addr convaddr;
struct hostent *resolve_addr;
CHAR build_line[LBLINESIZE];
CHAR szLBLine[LBLINESIZE];
ULONG errtab;
ULONG RRTime;
//
RRTime = GetTickCount() - Timestamp;
if (lpReply->Status > IP_UNLOAD)
{
wsprintf(szLBLine,"Ping: Error - Status = %ld",
lpReply->Status);
PrintLine(szLBLine,lppingvars);
return FALSE;
}
if (lpReply->Status != IP_SUCCESS)
{
if (!(lpReply->Status == IP_REQ_TIMED_OUT ||
IP_TTL_EXPIRED_TRANSIT))
{
errtab = lpReply->Status - IP_STATUS_BASE;
wsprintf(szLBLine,"Ping: Error - Status = %ld %s",
lpReply->Status,
ErrorCodes[errtab].msg);
PrintLine(szLBLine,lppingvars);
return FALSE;
}
}
wsprintf(szLBLine,
" TTL = %u Probe = %u ",
ttl,
probe);
convaddr.s_addr = lpReply->Address;
szTempName = inet_ntoa(convaddr);
if (szTempName)
strcpy(szHost,szTempName);
else
strcpy(szHost,"Unknown Address");
if (lppingvars->opt_resolve)
{
resolve_addr = gethostbyaddr((char*)&lpReply->Address,
4,AF_INET);
if (resolve_addr)
wsprintf(build_line,
"from %s [%s] ",
resolve_addr->h_name,
szHost);
else
wsprintf(build_line,
"from %s [Unkown] ",
szHost);
}
else
{
wsprintf(build_line,
"from %s ",
szHost);
}
strcat(szLBLine,build_line);
if (lpReply->Status == IP_SUCCESS)
{
wsprintf(build_line,
"Time %ld ms ",
lpReply->RoundTripTime);
strcat(szLBLine,build_line);
}
else
{
wsprintf(build_line,
"Time %lu ms Timed Out",
RRTime);
strcat(szLBLine,build_line);
//errtab = lpReply->Status;
//errtab -= IP_STATUS_BASE;
//strcat(szLBLine,
// ErrorCodes[errtab].msg);
}
PrintLine(szLBLine,lppingvars);
return TRUE;
}
void CPingThread::CleanUp()
{
FreeLibrary(Icmpdll); // remove icmp dll
WSACleanup();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -