www.pudn.com > SNMPApp.rar > Ping.cpp


#include "stdafx.h" 
#include "winsock2.h" 
 
 
typedef struct IPINFO 
{ 
	unsigned char Ttl;				// Time To Live 
	unsigned char Tos;				// Type Of Service 
	unsigned char IPFlags;			// IP flags 
	unsigned char OptSize;			// Size of options data 
	unsigned char FAR *Options;	// Options data buffer 
}IPINFO; 
typedef IPINFO* PIPINFO; 
 
typedef struct ICMPECHO 
{ 
	unsigned long Source;			// Source address 
	unsigned long Status;			// IP status 
	unsigned long RTTime;			// Round trip time in milliseconds 
	unsigned short DataSize;		// Reply data size 
	unsigned short Reserved;		// Unknown 
	void FAR *pData;		// Reply data buffer 
	IPINFO	ipInfo;			// Reply options 
}ICMPECHO; 
typedef ICMPECHO* PICMPECHO; 
 
// ICMP.DLL Export Function Pointers 
HANDLE (WINAPI *pIcmpCreateFile)(VOID); 
BOOL (WINAPI *pIcmpCloseHandle)(HANDLE); 
DWORD (WINAPI *pIcmpSendEcho) 
(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD); 
HANDLE hndlIcmp;	// LoadLibrary() handle to ICMP.DLL 
 
BOOL InitPing() 
{ 
	WSADATA wsaData;			// WSADATA 
 
	// Dynamically load the ICMP.DLL 
	hndlIcmp = LoadLibrary("ICMP.DLL"); 
	if (hndlIcmp == NULL) 
	{ 
		AfxMessageBox("Could not load ICMP.DLL!"); 
		return FALSE; 
	} 
	// Retrieve ICMP function pointers 
	pIcmpCreateFile  = (HANDLE (WINAPI *)(void)) 
		GetProcAddress((HMODULE)hndlIcmp,"IcmpCreateFile"); 
	pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) 
		GetProcAddress((HMODULE)hndlIcmp,"IcmpCloseHandle"); 
	pIcmpSendEcho = (DWORD (WINAPI *) 
		(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) 
		GetProcAddress((HMODULE)hndlIcmp,"IcmpSendEcho"); 
	// Check all the function pointers 
	if (pIcmpCreateFile == NULL		||  
		pIcmpCloseHandle == NULL	|| 
		pIcmpSendEcho == NULL) 
	{ 
		AfxMessageBox("Error loading ICMP.DLL!"); 
		FreeLibrary((HMODULE)hndlIcmp); 
		return FALSE; 
	} 
 
	// Init WinSock 
	BOOL nRet = WSAStartup(0x0101, &wsaData); 
    if (nRet) 
    { 
		AfxMessageBox("WSAStartup() error:"); 
        WSACleanup(); 
		FreeLibrary((HMODULE)hndlIcmp); 
        return FALSE; 
    } 
    // Check WinSock version 
    if (0x0101 != wsaData.wVersion) 
    { 
		AfxMessageBox("No WinSock version 1.1 support found!"); 
        WSACleanup(); 
		FreeLibrary((HMODULE)hndlIcmp); 
        return FALSE; 
    } 
 
	return TRUE; 
} 
 
BOOL Ping(char* sHost) 
{ 
	struct in_addr iaDest;		// Internet address structure 
	DWORD dwAddress;			// IP Address 
	IPINFO ipInfo;				// IP Options structure 
	ICMPECHO icmpEcho;			// ICMP Echo reply buffer 
	HANDLE hndlFile;			// Handle for IcmpCreateFile() 
 
	// Lookup destination 
    // Use inet_addr() to determine if we're dealing with a name 
    // or an address 
    iaDest.s_addr = inet_addr(sHost); 
	dwAddress = iaDest.s_addr; 
 
	// Get an ICMP echo request handle         
	hndlFile = pIcmpCreateFile(); 
 
	// Set some reasonable default values 
	ipInfo.Ttl = 255; 
	ipInfo.Tos = 0; 
	ipInfo.IPFlags = 0; 
	ipInfo.OptSize = 0; 
	ipInfo.Options = NULL; 
	icmpEcho.Status = 0; 
	// Reqest an ICMP echo 
	pIcmpSendEcho( 
		hndlFile,		// Handle from IcmpCreateFile() 
		dwAddress,		// Destination IP address 
		NULL,			// Pointer to buffer to send 
		0,				// Size of buffer in bytes 
		&ipInfo,		// Request options 
		&icmpEcho,		// Reply buffer 
		sizeof(ICMPECHO), 
		1000);			// Time to wait in milliseconds 
	// Print the results 
	iaDest.s_addr = icmpEcho.Source; 
	if (icmpEcho.Status) 
	{ 
		return FALSE; 
	} 
 
	// Close the echo request file handle 
	pIcmpCloseHandle(hndlFile); 
	return TRUE; 
} 
 
void ReleasePing() 
{ 
	WSACleanup(); 
	FreeLibrary((HMODULE)hndlIcmp); 
}