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

📄 pingthread.cpp

📁 你想看自己的 IP及其内容吗? 现在有一个能查看IP网络状态(连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}


	
	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 + -