Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members

NetPing.cpp

00001 /*
00002 ISSA¿¡ ´ëÇÑ ¶óÀ̼¾½º ¸í½ÃÀÔ´Ï´Ù.
00003 ¾Æ·¡ ¶óÀ̼¾½º¿¡ µ¿ÀÇÇϽô ºÐ¸¸ ISSA ½Ã¸®Á »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
00004 
00005   ÇÁ·Î±×·¥¸í : ISSA
00006   ÀúÀÚ±Ç : °æÈñ´ëÇб³ ½Ç½Ã°£¸ÖƼ¹Ìµð¾î ¿¬±¸½Ç ¹× °³¹ßÀÚ
00007   ¹èÆ÷ Homepage   : http://www.open-streaming.org
00008   °ü·Ã Homepage   : http://oslab.kyunghee.ac.kr
00009   ¹®ÀÇÀÚ E-Mail   : kimth@oslab.kyunghee.ac.kr
00010   
00011         1. ISSA ½Ã¸®ÁîÀÇ ¸ðµç ÀúÀÛ±ÇÀº "°æÈñ´ëÇб³ ½Ç½Ã°£¸ÖƼ¹Ìµð¾î¿¬±¸½Ç"¿¡ ÀÖ½À´Ï´Ù.
00012         2. ISSA ½Ã¸®ÁîÀÇ ¹èÆ÷±ÇÀº ÀÏÂ÷ÀûÀ¸·Î "°æÈñ´ëÇб³ ½Ç½Ã°£ ¸ÖƼ¹Ìµð¾î ¿¬±¸½Ç"¿¡¼­
00013         Çã¿ëÇÑ °÷¿¡¸¸ ÀÖ½À´Ï´Ù.
00014         (Çã¶ô ¸ÃÁö ¾ÊÀº Àç¹èÆ÷´Â Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù. ¹«´Ü ¹èÆ÷ÇÏÁö ¸¶½Ê½Ã¿À.)
00015         3. ISSA ½Ã¸®Áî´Â ÀúÀÛ±Ç ¸í½Ã½Ã ´©±¸³ª »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
00016         (°³ÀÎ,ºñ¿µ¸®´Üü,»ó¾÷»çÀÌÆ® ±â¾÷À̳ª ¿µ¸®,ºñ¿µ¸® ´ÜüÆ÷ÇÔ)
00017         4. ISSA ½Ã¸®Áî »ç¿ë½Ã ÀúÀÛ±Ç ¸í½ÃºÎºÐÀ» ÈѼÕÇÏ¸é ¾ÈµË´Ï´Ù.
00018         (ÀúÀÛ±Ç Ç¥½Ã´Â ¿øº» ±×´ë·Î¸¦ À¯Áö ÇÏ¿©¾ß ÇÕ´Ï´Ù.ÀÓÀÇ ¼öÁ¤ ¹× ¾ÆÀÌÄÜÈ­ ±ÝÁö)
00019         5. ´Ü, Á¤½Ä ¶óÀ̼¾½º ÃëµæÀ» Çϸé ÀúÀÛ±Ç Ç¥½Ã¸¦ »èÁ¦ÇÒ¼ö ÀÖ½À´Ï´Ù.
00020         (Á¤½Ä µî·Ï¿¡ ´ëÇÑ ¹®ÀÇ´Â À§ÀÇ ¹®ÀÇÀÚ ¸ÞÀÏ·Î ¹®ÀÇÇÏ¿© Áֽʽÿä.)
00021         6. ISSA ½Ã¸®Áî´Â »ç¿ëÀ¸·Î ÀÎÇÑ µ¥ÀÌŸ ¼Õ½Ç ¹× ±âŸ ¼ÕÇØ¿¡ ´ëÇØ¼­ Ã¥ÀÓÀ» ÁöÁö ¾Ê½À´Ï´Ù.
00022         7. ISSA ½Ã¸®Áî¿¡ ´ëÇØ À¯Áö/º¸¼öÀÇ Àǹ«°¡ ¾ø½À´Ï´Ù.
00023         8. ISSA ½Ã¸®ÁîÀÇ »ó¾÷Àû ¸ñÀûÀ¸·Î ÆÇ¸ÅÇÒ¼ö ¾ø½À´Ï´Ù.
00024         9. ISSA ½Ã¸®Áî´Â ¼Ò½º´Â °³ÀÎÀûÀ¸·Î »ç¿ë½Ã ¼öÁ¤ÇÏ¿© »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
00025         (´Ü ¼öÁ¤¹èÆ÷´Â ¾ÈµË´Ï´Ù.)
00026         10. ISSA ½Ã¸®Áî¿¡ »ç¿ëµÈ °ü·Ã ¼ÒÇÁÆ®¿þ¾î ÀúÀÛ±ÇÀº °¢ ¼ÒÇÁÆ®¿þ¾î Á¦ÀÛȸ»ç ¹× Á¦ÀÛÀÚ
00027     ¿¡°Ô ÀÖ½À´Ï´Ù.
00028         11. ISSA ½Ã¸®Áî ¶óÀ̼¾½º Ãëµæ¿¡ ´ëÇÑ ¹®ÀÇ´Â ¹®ÀÇÀÚ ¸ÞÀÏ·Î
00029     ¹®ÀÇÇÏ¿© Áֽʽÿä.
00030         12. ±âŸ Àǹ®»çÇ×Àº http://www.open-streaming.org ¿¡¼­ °Ô½ÃÆÇÀ» ÀÌ¿ëÇÏ¿© ÁֽʽÿÀ.
00031     (ÀÏ¹Ý Áú¹®Àº ¸ÞÀÏ·Î ¹ÞÁö ¾Ê½À´Ï´Ù.)
00032         13. À§ »çÇ׿¡ µ¿ÀÇÇϽô ºÐ¸¸ ISSA ½Ã¸®Á »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù.
00033 */
00034 
00035 // NetPing.cpp: implementation of the NetPing class.
00036 //
00038 
00039 #include "NetPing.h"
00040 
00041 #if defined(WIN32)
00042         #include <stdlib.h>             // MS-Windows 32
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 // Construction/Destruction
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), // Default language
00130                                    (LPTSTR) &lpMsgBuf,
00131                                    0,    
00132                                    NULL );
00133         
00134         ISSALOGF("NetPing::DisplayErr", "%s", (const char*)lpMsgBuf );
00135 
00136     /* Free the buffer */
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                 /* Error value is out of range, display normally */
00148                 ISSALOGF("NetPing::PIcmpErr","%d", nICMPErr );
00149 
00150                 DisplayErr(nICMPErr);
00151 
00152     } else {
00153                 /* Display ICMP Error String */
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      * Get pointers to ICMP.DLL functions
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      * IcmpCreateFile() - Open the ping service
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      * Init data buffer printable ASCII 
00195      *  32 (space) through 126 (tilde)
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      * Init IPInfo structure
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 //              issaLog::LogFormat("NetPing::PIcmpErr", "Pinging %s [%s] with %d bytes of data: ", 
00217 //                                                      m_lpstHost->h_name, inet_ntoa( m_stDestAddr ), m_nDataLen );      
00218     } else {
00219 //              issaLog::LogFormat("NetPing::PIcmpErr", "Pinging %s with %d bytes of data: ", 
00220 //                                                      inet_ntoa( m_stDestAddr ), m_nDataLen );        
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      * Ping Loop
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        * IcmpSendEcho() - Send the ICMP Echo Request
00255        *                   and read the Reply
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 /*                      issaLog::LogFormat( "NetPing::Ping", "Reply from %s: bytes=%d time=%ldms TTL=%u ",
00274                                                                 inet_ntoa(stDestAddr), *(u_long *) &(m_achRepData[12]),
00275                                                                 *(u_long *) &(m_achRepData[8]),
00276                                                                 (*(char *)&(m_achRepData[20]))&0x00FF );
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;  // end loop
00287                         }
00288                 }
00289                 temp.Format( "%ld", *(u_long *) &(m_achRepData[8]) );
00290                 TotalPingTime += temp.GetLongInteger();
00291         } /* end ping loop */
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 //      issaLog::LogFormat( "NetPing::Ping","AvrPingTime(str) : %s", AvrPingTime );
00303 }
00304 
00305 void NetPing::GetAvrPingTime( double &AvrPingTime )
00306 {       
00307         AvrPingTime = m_AvrPingTime;
00308 //      issaLog::LogFormat( "NetPing::Ping","AvrPingTime(double) : %lu", AvrPingTime );
00309 }
00310 
00311 void NetPing::GetAvrPacketSize( double &AvrPacketSize )
00312 {
00313         AvrPacketSize = m_AvrPacketSize;
00314 }

Generated on Fri Nov 28 05:13:07 2003 for NetInterface by doxygen 1.3.3