diff options
author | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-07-31 05:07:21 +0000 |
---|---|---|
committer | sje <sje@4f64403b-2f21-0410-a795-97e2b3489a10> | 2007-07-31 05:07:21 +0000 |
commit | 0ff1d601dfadfd19e286c021fd1288e8b8b4b7c2 (patch) | |
tree | aafe89e4f6870ad528f00e081d31432cdfbb8d32 /ping/icmp.cpp | |
parent | 87a314a0f8b3aa138601963c0e98d339997b9d6e (diff) |
use yapp api for popup classes
use fontservice for fame background colour
add beta changelog url link to svn log
use IPHLPAPI.dll if available, and use only one icmp file handle
git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@316 4f64403b-2f21-0410-a795-97e2b3489a10
Diffstat (limited to 'ping/icmp.cpp')
-rw-r--r-- | ping/icmp.cpp | 76 |
1 files changed, 47 insertions, 29 deletions
diff --git a/ping/icmp.cpp b/ping/icmp.cpp index 356cc34..4dab823 100644 --- a/ping/icmp.cpp +++ b/ping/icmp.cpp @@ -1,21 +1,33 @@ #include "common.h"
#include "icmp.h"
-ICMP ICMP::instance;
+char data[] = "AAAABBBBCCCCDDDDEEEEFFFFGGGGHHH";
+#define EXTRA (12)
+ICMP *ICMP::instance = 0;
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;
+ hDLL = LoadLibrary("IPHLPAPI.DLL");
+ if(hDLL) {
+ pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile");
+ pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle");
+ pIcmpSendEcho2 = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho2");
}
+ if (hDLL == 0 || pIcmpCreateFile == 0 || pIcmpCloseHandle == 0 || pIcmpSendEcho2 == 0) {
+ hDLL = LoadLibrary("ICMP.DLL");
+ if(hDLL) {
+ pIcmpCreateFile = (pfnHV)GetProcAddress(hDLL, "IcmpCreateFile");
+ pIcmpCloseHandle = (pfnBH)GetProcAddress(hDLL, "IcmpCloseHandle");
+ pIcmpSendEcho2 = (pfnDHDPWPipPDD)GetProcAddress(hDLL, "IcmpSendEcho2");
+ }
+ if (hDLL == 0 || pIcmpCreateFile == 0 || pIcmpCloseHandle == 0 || pIcmpSendEcho2 == 0)
+ return;
+ else
+ DBWriteContactSettingString(0, PLUG, "PingLib", "ICMP.DLL"); // for debugging
+ } else
+ DBWriteContactSettingString(0, PLUG, "PingLib", "IPHLPAPI.DLL"); // for debugging
WSAData wsaData;
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
@@ -30,6 +42,7 @@ ICMP::ICMP(): return;
}
+ buff = new char[sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA];
functions_loaded = true;
}
@@ -41,33 +54,25 @@ void ICMP::stop() { }
ICMP::~ICMP() {
- if(hIP) pIcmpCloseHandle(hIP);
+ if(hIP) stop();
WSACleanup();
if(hDLL)
FreeLibrary(hDLL);
+ delete[] buff;
}
-bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) {
+bool ICMP::ping(char *host, ICMP_ECHO_REPLY &reply) {
if(!functions_loaded) return false;
- DWORD address;
- struct in_addr dest;
+ unsigned long address;
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) {
+ address = inet_addr(host);
+ if (address == INADDR_NONE) {
rec = gethostbyname(host);
- if(rec) address = *(DWORD *)(*rec->h_addr_list);
+ if(rec) address = *(unsigned long *)(*rec->h_addr_list);
else return false;
- } else {
- address = dest.s_addr;
}
ipoi.Ttl = 255;
@@ -78,12 +83,25 @@ bool ICMP::ping(char *host, IP_ECHO_REPLY &reply) { reply.Status = 0;
- pIcmpSendEcho(hIP, address, (void *)"PINGPONG", 8, &ipoi, &reply, sizeof(reply), timeout);
-
- if(hIP) {
- pIcmpCloseHandle(hIP);
- hIP = 0;
+ //pIcmpSendEcho2(hIP, 0, 0, 0, address, data, sizeof(data), &ipoi, buff, sizeof(ICMP_ECHO_REPLY) + sizeof(data), timeout);
+ if(pIcmpSendEcho2(hIP, 0, 0, 0, address, data, sizeof(data), 0, buff, sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA, timeout) == 0) {
+ char winmsg[512], msg[1024];
+ FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, winmsg, 512, 0);
+ mir_snprintf(msg, 1024, "Ping error: %s\nICMP_ECHO_REPLY: %d\ndata: %d\ngiven: %d", winmsg, sizeof(ICMP_ECHO_REPLY), sizeof(data), sizeof(ICMP_ECHO_REPLY) + sizeof(data) + EXTRA);
+ PUShowMessage(msg, SM_NOTIFY);
+ return false;
}
+ memcpy(&reply, buff, sizeof(ICMP_ECHO_REPLY));
return (reply.Status == 0);
+}
+
+ICMP *ICMP::get_instance() {
+ if(!instance)
+ instance = new ICMP();
+ return instance;
+}
+
+void ICMP::cleanup() {
+ if(instance) delete instance;
}
\ No newline at end of file |