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