00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00038
00039 #include "NetPing.h"
00040
00041 #if defined(WIN32)
00042 #include <stdlib.h>
00043
00044 LPHOSTENT NetPing::m_lpstHost = NULL;
00045 char* NetPing::m_pDestAddr = NULL;
00046 IN_ADDR NetPing::m_stDestAddr;
00047
00048 char *m_paszSendEchoErr[] = {
00049 "IP_STATUS_BASE (11000)",
00050 "IP_BUF_TOO_SMALL (11001)",
00051 "IP_DEST_NET_UNREACHABLE (11002)",
00052 "IP_DEST_HOST_UNREACHABLE (11003)",
00053 "IP_DEST_PROT_UNREACHABLE (11004)",
00054 "IP_DEST_PORT_UNREACHABLE (11005)",
00055 "IP_NO_RESOURCES (11006)",
00056 "IP_BAD_OPTION (11007)",
00057 "IP_HW_ERROR (11008)",
00058 "IP_PACKET_TOO_BIG (11009)",
00059 "IP_REQ_TIMED_OUT (11010)",
00060 "IP_BAD_REQ (11011)",
00061 "IP_BAD_ROUTE (11012)",
00062 "IP_TTL_EXPIRED_TRANSIT (11013)",
00063 "IP_TTL_EXPIRED_REASSEM (11014)",
00064 "IP_PARAM_PROBLEM (11015)",
00065 "IP_SOURCE_QUENCH (11016)",
00066 "IP_OPTION_TOO_BIG (11017)",
00067 "IP_BAD_DESTINATION (11018)",
00068 "IP_ADDR_DELETED (11019)",
00069 "IP_SPEC_MTU_CHANGE (11020)",
00070 "IP_MTU_CHANGE (11021)",
00071 "IP_UNLOAD (11022)"
00072 };
00073
00074 #elif defined(SOLARIS2) // SOLARIS2
00075
00076 #endif // defined( WIN32 & SOLARIS2 )
00077
00079
00081 NetPing::NetPing()
00082 {
00083 m_pachBCastAddr = "255.255.255.255";
00084 m_nDataLen = DEFAULT_LEN;
00085 m_nLoopLimit = LOOPLIMIT;
00086 m_nTimeOut = TIMEOUT;
00087 m_plpstIPInfo = NULL;
00088 m_nTTL = DEFAULT_TTL;
00089 m_nTOS = 0;
00090 m_AvrPingTime = 0;
00091 }
00092
00093 NetPing::~NetPing()
00094 {
00095 m_fRet = lpfnIcmpCloseHandle( m_hICMP );
00096 if ( m_fRet == FALSE ) {
00097 int nErr = GetLastError();
00098 PIcmpErr( nErr );
00099 }
00100
00101 FreeLibrary((struct HINSTANCE__*)m_hICMP_DLL);
00102
00103 WSACleanup();
00104 }
00105
00106 bool NetPing::Init()
00107 {
00108 WSADATA wsaData;
00109 WORD wVersionRequested = MAKEWORD ( 1, 1 );
00110
00111 if ( WSAStartup( wVersionRequested, &wsaData ) == SOCKET_ERROR )
00112 {
00113 WSACleanup();
00114 return false;
00115 }
00116 LoadICMP();
00117
00118 return true;
00119 }
00120
00121 void NetPing::DisplayErr( int nWSAErr )
00122 {
00123 LPVOID lpMsgBuf;
00124
00125 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
00126 NULL,
00127 nWSAErr,
00128 MAKELANGID(LANG_NEUTRAL,
00129 SUBLANG_DEFAULT),
00130 (LPTSTR) &lpMsgBuf,
00131 0,
00132 NULL );
00133
00134 ISSALOGF("NetPing::DisplayErr", "%s", (const char*)lpMsgBuf );
00135
00136
00137 LocalFree (lpMsgBuf);
00138
00139 return;
00140 }
00141
00142 void NetPing::PIcmpErr(int nICMPErr )
00143 {
00144 int nErrIndex = nICMPErr - IP_STATUS_BASE;
00145
00146 if ( (nICMPErr > MAX_ICMP_ERR_STRING) || (nICMPErr < IP_STATUS_BASE+1) ) {
00147
00148 ISSALOGF("NetPing::PIcmpErr","%d", nICMPErr );
00149
00150 DisplayErr(nICMPErr);
00151
00152 } else {
00153
00154 ISSALOGF("NetPing::PIcmpErr","%s", m_paszSendEchoErr[nErrIndex] );
00155 }
00156
00157 return;
00158 }
00159
00160 bool NetPing::LoadICMP()
00161 {
00162 m_hICMP_DLL = ::LoadLibrary("ICMP.DLL");
00163 if ( m_hICMP_DLL == 0 ) {
00164 issaLog::Log("NetPing::LoadICMP", "LoadLibrary() failed: Unable to locate ICMP.DLL!");
00165 return false;
00166 }
00167
00168
00169
00170
00171 lpfnIcmpCreateFile = ( HANDLE (WINAPI *)(void))::GetProcAddress((HMODULE)m_hICMP_DLL, "IcmpCreateFile" );
00172
00173 lpfnIcmpCloseHandle = ( BOOL (WINAPI *)(HANDLE))::GetProcAddress((HMODULE)m_hICMP_DLL, "IcmpCloseHandle" );
00174
00175 lpfnIcmpSendEcho = ( DWORD (WINAPI *)(HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))::GetProcAddress((HMODULE)m_hICMP_DLL, "IcmpSendEcho" );
00176
00177 if ( (!lpfnIcmpCreateFile) || (!lpfnIcmpCloseHandle) || (!lpfnIcmpSendEcho) ) {
00178 issaLog::Log("NetPing::LoadICMP", "GetProcAddr() failed for at least one function.");
00179 return false;
00180 }
00181
00182
00183
00184
00185 m_hICMP = (HANDLE) lpfnIcmpCreateFile();
00186 if ( m_hICMP == INVALID_HANDLE_VALUE )
00187 {
00188 issaLog::Log("NetPing::LoadICMP", "IcmpCreateFile() failed, err:");
00189 PIcmpErr( GetLastError() );
00190 return false;
00191 }
00192
00193
00194
00195
00196
00197 int j, i;
00198 for (j=0, i=32; j < m_nDataLen; j++, i++) {
00199 if ( i >= 126 )
00200 i= 32;
00201 m_achReqData[j] = i;
00202 }
00203
00204
00205
00206
00207 m_plpstIPInfo = &m_stIPInfo;
00208 m_stIPInfo.Ttl = m_nTTL;
00209 m_stIPInfo.Tos = m_nTOS;
00210 m_stIPInfo.Flags = m_fDontFrag ? IPFLAG_DONT_FRAGMENT : 0;
00211 m_stIPInfo.OptionsSize = 0;
00212 m_stIPInfo.OptionsData = NULL;
00213
00214
00215 if ( m_lpstHost ) {
00216
00217
00218 } else {
00219
00220
00221 }
00222
00223 return true;
00224 }
00225
00226 void NetPing::Ping( const issaString &DestAddr, const int LoopLimit, const int& nDataLen )
00227 {
00228 Init();
00229
00230 m_LoopLimit = LoopLimit;
00231
00232 m_pDestAddr = ( char* )DestAddr;
00233 m_lpstHost = gethostbyname( m_pDestAddr );
00234 m_nDataLen = nDataLen;
00235
00236 u_long ulDestAddr = inet_addr( m_pDestAddr );
00237 memcpy( &m_stDestAddr, &ulDestAddr, 4 );
00238
00239
00240
00241
00242 int k = 0;
00243 double
00244 TotalPingTime = 0,
00245 TotalPacketSize = 0;
00246 issaString temp;
00247
00248 for (k = 0; k < m_LoopLimit; k++) {
00249 if ( k ) {
00250 SleepEx(1000, TRUE);
00251 }
00252
00253
00254
00255
00256
00257 m_dwReplyCount = lpfnIcmpSendEcho( m_hICMP,
00258 m_stDestAddr.s_addr,
00259 m_achReqData,
00260 m_nDataLen,
00261 m_plpstIPInfo,
00262 m_achRepData,
00263 sizeof( m_achRepData ),
00264 m_nTimeOut );
00265
00266 if ( m_dwReplyCount != 0 ) {
00267 IN_ADDR stDestAddr;
00268 DWORD dwStatus;
00269 stDestAddr.s_addr = *(u_long *)m_achRepData;
00270
00271 TotalPacketSize += *(u_long *) &(m_achRepData[12]);
00272
00273
00274
00275
00276
00277
00278 dwStatus = *(DWORD *) &( m_achRepData[4] );
00279
00280 if (dwStatus == IP_SUCCESS) {
00281 PIcmpErr(dwStatus);
00282 }
00283 else {
00284 ISSALOG( "NetPing::Ping", "IcmpSendEcho() failed, err: " );
00285 PIcmpErr(GetLastError());
00286 break;
00287 }
00288 }
00289 temp.Format( "%ld", *(u_long *) &(m_achRepData[8]) );
00290 TotalPingTime += temp.GetLongInteger();
00291 }
00292
00293 m_AvrPacketSize = ( TotalPacketSize / (double)m_LoopLimit );
00294 m_AvrPingTime = ( TotalPingTime / (double)m_LoopLimit );
00295 }
00296
00297 void NetPing::GetAvrPingTime( issaString &AvrPingTime )
00298 {
00299 issaString RetVlu;
00300 RetVlu.Format( "%d", (int)m_AvrPingTime );
00301 AvrPingTime = RetVlu;
00302
00303 }
00304
00305 void NetPing::GetAvrPingTime( double &AvrPingTime )
00306 {
00307 AvrPingTime = m_AvrPingTime;
00308
00309 }
00310
00311 void NetPing::GetAvrPacketSize( double &AvrPacketSize )
00312 {
00313 AvrPacketSize = m_AvrPacketSize;
00314 }