00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "fsSitePingMgr.h"
00008 #include "inetutil.h"
00009
00010 #ifdef _DEBUG
00011 #undef THIS_FILE
00012 static char THIS_FILE[]=__FILE__;
00013 #define new DEBUG_NEW
00014 #endif
00015
00016 fsSitePingMgr::fsSitePingMgr()
00017 {
00018 m_hDllIcmp = LoadLibrary ("icmp.dll");
00019 if (m_hDllIcmp)
00020 {
00021 m_pfnIcmpCreateFile = (HANDLE (WINAPI *)(void))
00022 GetProcAddress (m_hDllIcmp, "IcmpCreateFile");
00023
00024 m_pfnIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
00025 GetProcAddress (m_hDllIcmp, "IcmpCloseHandle");
00026
00027 m_pfnIcmpSendEcho = (DWORD (WINAPI *)
00028 (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
00029 GetProcAddress (m_hDllIcmp, "IcmpSendEcho");
00030 }
00031 }
00032
00033 fsSitePingMgr::~fsSitePingMgr()
00034 {
00035 if (m_hDllIcmp)
00036 FreeLibrary (m_hDllIcmp);
00037 }
00038
00039 DWORD fsSitePingMgr::Ping(LPCSTR pszSite)
00040 {
00041 IPINFO ipInfo;
00042
00043 WORD w = MAKEWORD (1,1);
00044 WSADATA data;
00045 ::WSAStartup (w, &data);
00046
00047 if (TestState () == FALSE)
00048 return SPM_PINGERR;
00049
00050 HANDLE hFile = m_pfnIcmpCreateFile();
00051
00052 if (hFile == NULL || hFile == INVALID_HANDLE_VALUE)
00053 return SPM_PINGERR;
00054
00055 ipInfo.Ttl = 238;
00056 ipInfo.Tos = 0;
00057 ipInfo.IPFlags = 0;
00058 ipInfo.OptSize = 0;
00059 ipInfo.Options = NULL;
00060
00061 ULONG dwIp = fsGetSiteIp (pszSite);
00062
00063 if (dwIp == 0)
00064 {
00065 m_pfnIcmpCloseHandle (hFile);
00066 return SPM_PINGERR;
00067 }
00068
00069 char reply [sizeof (ICMPECHO)+50];
00070 ICMPECHO* iep = (ICMPECHO*) reply;
00071 iep->RTTime = 0xffffffff;
00072
00073 char buftosend [32];
00074 memset (buftosend, 0, sizeof (buftosend));
00075
00076 m_pfnIcmpSendEcho(
00077 hFile,
00078 dwIp,
00079 buftosend,
00080 sizeof (buftosend),
00081 NULL,
00082 iep,
00083 sizeof (reply),
00084 5000);
00085
00086 m_pfnIcmpCloseHandle (hFile);
00087
00088 if (!iep->Status)
00089 return iep->RTTime;
00090 else
00091 return SPM_PINGERR;
00092 }
00093
00094 BOOL fsSitePingMgr::TestState()
00095 {
00096 return m_hDllIcmp && m_pfnIcmpCloseHandle && m_pfnIcmpCreateFile &&
00097 m_pfnIcmpSendEcho;
00098 }