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;
}
就這樣
以上程式碼我只有修改成可以編譯執行
原程式碼不是我寫的
浙公网安备 33010602011771号