Ping.cpp
上传用户:qiye66692
上传日期:2022-04-25
资源大小:72k
文件大小:2k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include ".ping.h"
  3. CPing::CPing(void)
  4. {
  5. bValid = false;
  6. WSADATA wsaData; 
  7. // Dynamically load the ICMP.DLL
  8. hIcmp = LoadLibrary("ICMP.DLL");
  9. if (hIcmp == NULL)
  10. {
  11. ::MessageBox(NULL, "Could not load ICMP.DLL", "Error:", MB_OK);
  12. return;
  13. }
  14. // Retrieve ICMP function pointers
  15. IcmpCreateFile = (HANDLE (WINAPI*) (void))
  16. GetProcAddress( (HMODULE)hIcmp, "IcmpCreateFile" );
  17. IcmpCloseHandle = (BOOL (WINAPI *)(HANDLE)) 
  18. GetProcAddress((HMODULE)hIcmp,"IcmpCloseHandle");
  19. IcmpSendEcho = (DWORD (WINAPI *) (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD)) 
  20. GetProcAddress((HMODULE)hIcmp,"IcmpSendEcho");
  21. // Check all the function pointers
  22. if (IcmpCreateFile == NULL || IcmpCloseHandle == NULL || IcmpSendEcho == NULL)
  23. {
  24. ::MessageBox(NULL, "Error loading ICMP.DLL", "Error:", MB_OK);
  25. FreeLibrary((HMODULE)hIcmp);
  26. return;
  27. }
  28. // Init WinSock  
  29.     if( WSAStartup( MAKEWORD(2,0), &wsaData ) != 0 )
  30.     {
  31. ::MessageBox(NULL, "WSAStartup error!", "Error:", MB_OK);
  32.         WSACleanup();
  33. FreeLibrary((HMODULE)hIcmp);
  34.         return;
  35.     }
  36.     // Check WinSock version
  37.     if ( wsaData.wVersion != MAKEWORD(2,0) )
  38.     {
  39. ::MessageBox(NULL, "No WinSock version 2.0 support found", "Error:", MB_OK);
  40.         WSACleanup();
  41. FreeLibrary((HMODULE)hIcmp);
  42.         return;
  43.     }
  44. bValid = TRUE;
  45. }
  46. CPing::~CPing(void)
  47. {
  48. WSACleanup();
  49. FreeLibrary((HMODULE)hIcmp);
  50. }
  51. bool CPing::ping(CString strHost)
  52. {
  53. DWORD dwAddress; // IP Address
  54. IPINFO ipInfo; // IP Options structure
  55. ICMPECHO icmpEcho; // ICMP Echo reply buffer
  56. HANDLE hFile; // Handle for IcmpCreateFile()
  57.     if(!bValid)
  58. {
  59. return FALSE;
  60. }
  61.     dwAddress = inet_addr(strHost);
  62. // Get an ICMP echo request handle        
  63. hFile = IcmpCreateFile();
  64. // Set some reasonable default values
  65. ipInfo.TTL = 255;
  66. ipInfo.TOS = 0;
  67. ipInfo.IPFlags = 0;
  68. ipInfo.OptSize = 0;
  69. ipInfo.Options = NULL;
  70. icmpEcho.Status = 0;
  71. // Reqest an ICMP echo
  72. IcmpSendEcho(
  73. hFile,       // Handle from IcmpCreateFile()
  74. dwAddress,       // Destination IP address
  75. NULL,   // Pointer to buffer to send
  76. 0,         // Size of buffer in bytes
  77. &ipInfo,   // Request options
  78. &icmpEcho,   // Reply buffer
  79. sizeof(ICMPECHO),
  80. 500);   // Time to wait in milliseconds
  81. if (icmpEcho.Status)
  82. {
  83. return FALSE;
  84. }
  85. // Close the echo request file handle
  86. IcmpCloseHandle(hFile);
  87. return TRUE;
  88. }