Syntax

bool Ping(
      _in    char* sIpAddress
);

Parameter

sIpAddress [in]

Return Value

- true - 有ping到

- false - 沒ping到

ping.h

//----------------------------------------------------------------------------
#ifndef PingHPP
#define PingHPP
//---------------------------------------------------------------------------
#include <windows.h>

typedef struct tagIPINFO
{
	BYTE 		bTimeToLive;	//	Time To Live
	BYTE 		bTypeOfService; //	Type Of Service
	BYTE 		bIpFlags;		//	IP-Flags
	BYTE 		OptSize;		//	Grosse der Options Data Buffers
	BYTE*	Options;
}IPINFO, *PIPINFO;

typedef struct tagICMPECHO
{
	DWORD		dwSource;		//	Zieladresse
	DWORD		dwStatus;		//	IP-Status
	DWORD 		dwRTTime;		//	Round Trip Time in Millisekunden
	WORD 		wDataSize;		//	Grosse des Antwort-Buffers
	WORD 		wReserved;
	void*		pData;			//	Zeiger auf die Antwort-Daten
	IPINFO		ipInfo;			//	Antwort-Optionen
} ICMPECHO, *PICMPECHO;

// Zeiger auf die Funktionen aus der ICMP.DLL deklarieren:
typedef HANDLE (*PF_CMPCREATEFILE)(VOID);
typedef BOOL (*PF_ICMPCLOSEHANDLE)(HANDLE);
typedef DWORD (*PF_ICMPSENDECHO)(HANDLE, DWORD, LPVOID, WORD, PIPINFO, LPVOID, DWORD, DWORD);

//---------------------------------------------------------------------------
bool Ping(char* ip_address);
//---------------------------------------------------------------------------
#endif

ping.cpp

#include "ping.h"


bool Ping(char* ip_address)
{
	//	ICMP.DLL laden:
	HINSTANCE		hIcmp = LoadLibrary("ICMP.DLL");
	if( hIcmp == NULL )
	{
		return false;
	}

	//	Zeiger auf die Funktionen besorgen:
	PF_CMPCREATEFILE		pfIcmpCreateFile = (PF_CMPCREATEFILE)GetProcAddress(hIcmp, "IcmpCreateFile");
	PF_ICMPCLOSEHANDLE		pfIcmpCloseHandle = (PF_ICMPCLOSEHANDLE)GetProcAddress(hIcmp,"IcmpCloseHandle");
	PF_ICMPSENDECHO			pfIcmpSendEcho = (PF_ICMPSENDECHO)GetProcAddress(hIcmp,"IcmpSendEcho");

	//	Funktionszeiger prufen:
	if( pfIcmpCreateFile == NULL || pfIcmpCloseHandle == NULL || pfIcmpSendEcho == NULL )
	{
		FreeLibrary(hIcmp);
		return false;
	}

	// WinSock initialisieren
	WSADATA		wsaData;
	int			ilRetVal = WSAStartup(0x0101, &wsaData );

	if( ilRetVal )
	{
		WSACleanup();
		FreeLibrary(hIcmp);
		return false;
	}
	// Check WinSock version
	if( 0x0101 != wsaData.wVersion )
	{
		WSACleanup();
		FreeLibrary(hIcmp);
		return false;
	}

	// Prufen, ob es sich bei der Zieladresse um IP-Adresse handelt und
	// ggf. den die Adresse zum Namen ermitteln:
	struct		in_addr iaDest; // Struktur fur die Internet-Adresse

	iaDest.s_addr = inet_addr(ip_address);
	LPHOSTENT	pHost; // Zeiger auf die Host Entry Struktur

	if( iaDest.s_addr == INADDR_NONE )
		pHost = gethostbyname( ip_address);
	else
		pHost = gethostbyaddr( (const char*)&iaDest, sizeof(struct in_addr), AF_INET );

	// 若該 ip 不能解析出主機名稱者
	// 如 Router 或某些 Linux 主機 , 則回傳值仍是失敗 , 問題應出在這裡
	// 但又不能拿掉 ....
	if( pHost == NULL )
	{
		WSACleanup();
		FreeLibrary(hIcmp);
		return false;
	}

	// IP-Adresse kopieren
	DWORD*		pAddress = (DWORD*)(*pHost->h_addr_list);

	// ICMP Echo Request Handle besorgen:
	HANDLE		hIcmpFile = pfIcmpCreateFile();

	ICMPECHO	icmpEcho;		//	ICMP-Echo Antwortbuffer
	IPINFO		ipInfo;			//	IP-Optionenstruktur

	int			ilTimeSum = 0;	//	Summe der Round Trip Time-Daten
	int			ilCount = 0;	//	Anzahl der Round Trip Time-Daten

	for( int ilPingNo = 0; ilPingNo < 3; ilPingNo++ )
	{
		//	Default-Werte festlegen:
		::ZeroMemory(&ipInfo, sizeof(ipInfo));
		ipInfo.bTimeToLive = 255;
		//	ICMP Echo anfordern:
		pfIcmpSendEcho(hIcmpFile,			//	Handle von IcmpCreateFile()
						*pAddress,			//	Ziel-IP Addresse
						NULL,				//	Zeiger auf den Buffer mit denzu sendenden Daten
						0,					//	Buffergrosse in Bytes
						&ipInfo,			//	Request-Optionen
						&icmpEcho,			//	Antwort-Buffer
						sizeof(struct tagICMPECHO),		//	Buffergrosse
						5000);				//	Max. Wartezeit in Millisekunden

		// Ergebnisse anzeigen:
		iaDest.s_addr = icmpEcho.dwSource;

		// falls Fehler aufgetreten:
		if( icmpEcho.dwStatus )
		{

			break;
		}
		ilTimeSum += icmpEcho.dwRTTime;
		ilCount++;
		if( ilPingNo < 2 )
			Sleep(200);
	}

	// Echo-Request File Handle schliessen:
	pfIcmpCloseHandle(hIcmpFile);
	// ICMP.DLL freigeben:
	FreeLibrary(hIcmp);
	// Winsock schliessen:
	WSACleanup();

	// Den Mittelwert aller Round Trip Times zuruckgeben:
	//return ilRetVal = ilCount ? ilTimeSum/ilCount : -1;

	if( ilRetVal = ilCount )
		return true;
	else
		return false;
}

就這樣

以上程式碼我只有修改成可以編譯執行

原程式碼不是我寫的