From 49b4d6dd9d4d35adc9f02df4010a1a6b33faba63 Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 1 Nov 2006 14:44:34 +0000 Subject: git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@12 4f64403b-2f21-0410-a795-97e2b3489a10 --- ping_protocol/icmp.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ping_protocol/icmp.cpp (limited to 'ping_protocol/icmp.cpp') diff --git a/ping_protocol/icmp.cpp b/ping_protocol/icmp.cpp new file mode 100644 index 0000000..a9cd296 --- /dev/null +++ b/ping_protocol/icmp.cpp @@ -0,0 +1,83 @@ +#include "stdafx.h" +#include "icmp.h" + +ICMP ICMP::instance; + +ICMP::ICMP(): + timeout(2000), + functions_loaded(false) +{ + hDLL = LoadLibrary("ICMP.DLL"); + if(!hDLL) return; + + pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile"); + pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle"); + pIcmpSendEcho = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho"); + if ((pIcmpCreateFile == 0) || (pIcmpCloseHandle == 0) || (pIcmpSendEcho == 0)) { + return; + } + + WSAData wsaData; + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { + WSACleanup(); + FreeLibrary((HMODULE)hDLL); + return; + } + + functions_loaded = true; +} + +void ICMP::stop() { + if(hIP) { + pIcmpCloseHandle(hIP); + hIP = 0; + } +} + +ICMP::~ICMP() { + if(hIP) pIcmpCloseHandle(hIP); + WSACleanup(); + if(hDLL) + FreeLibrary(hDLL); +} + +bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) { + if(!functions_loaded) return false; + + DWORD address; + struct in_addr dest; + HOSTENT *rec; + IP_OPTION_INFORMATION ipoi; + + hIP = pIcmpCreateFile(); + if (hIP == INVALID_HANDLE_VALUE) { + return false; + } + + + dest.s_addr = inet_addr(host); + if (dest.s_addr == INADDR_NONE) { + rec = gethostbyname(host); + if(rec) address = *(DWORD *)(*rec->h_addr_list); + else return false; + } else { + address = dest.s_addr; + } + + ipoi.Ttl = 255; + ipoi.Tos = 0; + ipoi.Flags = 0; + ipoi.OptionsSize = 0; + ipoi.OptionsData = 0; + + reply.Status = 0; + + pIcmpSendEcho(hIP, address, (void *)"PINGPONG", 8, &ipoi, &reply, sizeof(reply), timeout); + + if(hIP) { + pIcmpCloseHandle(hIP); + hIP = 0; + } + + return (reply.Status == 0); +} \ No newline at end of file -- cgit v1.2.3