summaryrefslogtreecommitdiff
path: root/ping_protocol/icmp.cpp
diff options
context:
space:
mode:
authorsje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2006-11-01 14:44:34 +0000
committersje <sje@4f64403b-2f21-0410-a795-97e2b3489a10>2006-11-01 14:44:34 +0000
commit49b4d6dd9d4d35adc9f02df4010a1a6b33faba63 (patch)
tree403d0508eed3d1e1c9b336251eff931f3f2511b1 /ping_protocol/icmp.cpp
parentb61df7acc1235b3b2a66217d0d7358199c5d37f9 (diff)
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@12 4f64403b-2f21-0410-a795-97e2b3489a10
Diffstat (limited to 'ping_protocol/icmp.cpp')
-rw-r--r--ping_protocol/icmp.cpp83
1 files changed, 83 insertions, 0 deletions
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