Ping.cpp
上传用户:yfy060102
上传日期:2021-05-22
资源大小:60k
文件大小:4k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "winsock2.h"
  3. typedef struct IPINFO
  4. {
  5. unsigned char Ttl; // Time To Live
  6. unsigned char Tos; // Type Of Service
  7. unsigned char IPFlags; // IP flags
  8. unsigned char OptSize; // Size of options data
  9. unsigned char FAR *Options; // Options data buffer
  10. }IPINFO;
  11. typedef IPINFO* PIPINFO;
  12. typedef struct ICMPECHO
  13. {
  14. unsigned long Source; // Source address
  15. unsigned long Status; // IP status
  16. unsigned long RTTime; // Round trip time in milliseconds
  17. unsigned short DataSize; // Reply data size
  18. unsigned short Reserved; // Unknown
  19. void FAR *pData; // Reply data buffer
  20. IPINFO ipInfo; // Reply options
  21. }ICMPECHO;
  22. typedef ICMPECHO* PICMPECHO;
  23. // ICMP.DLL Export Function Pointers
  24. HANDLE (WINAPI *pIcmpCreateFile)(VOID);
  25. BOOL (WINAPI *pIcmpCloseHandle)(HANDLE);
  26. DWORD (WINAPI *pIcmpSendEcho)
  27. (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD);
  28. HANDLE hndlIcmp; // LoadLibrary() handle to ICMP.DLL
  29. BOOL InitPing()
  30. {
  31. WSADATA wsaData; // WSADATA
  32. // Dynamically load the ICMP.DLL
  33. hndlIcmp = LoadLibrary("ICMP.DLL");
  34. if (hndlIcmp == NULL)
  35. {
  36. AfxMessageBox("Could not load ICMP.DLL!");
  37. return FALSE;
  38. }
  39. // Retrieve ICMP function pointers
  40. pIcmpCreateFile  = (HANDLE (WINAPI *)(void))
  41. GetProcAddress((HMODULE)hndlIcmp,"IcmpCreateFile");
  42. pIcmpCloseHandle = (BOOL (WINAPI *)(HANDLE))
  43. GetProcAddress((HMODULE)hndlIcmp,"IcmpCloseHandle");
  44. pIcmpSendEcho = (DWORD (WINAPI *)
  45. (HANDLE,DWORD,LPVOID,WORD,PIPINFO,LPVOID,DWORD,DWORD))
  46. GetProcAddress((HMODULE)hndlIcmp,"IcmpSendEcho");
  47. // Check all the function pointers
  48. if (pIcmpCreateFile == NULL || 
  49. pIcmpCloseHandle == NULL ||
  50. pIcmpSendEcho == NULL)
  51. {
  52. AfxMessageBox("Error loading ICMP.DLL!");
  53. FreeLibrary((HMODULE)hndlIcmp);
  54. return FALSE;
  55. }
  56. // Init WinSock
  57. BOOL nRet = WSAStartup(0x0101, &wsaData);
  58.     if (nRet)
  59.     {
  60. AfxMessageBox("WSAStartup() error:");
  61.         WSACleanup();
  62. FreeLibrary((HMODULE)hndlIcmp);
  63.         return FALSE;
  64.     }
  65.     // Check WinSock version
  66.     if (0x0101 != wsaData.wVersion)
  67.     {
  68. AfxMessageBox("No WinSock version 1.1 support found!");
  69.         WSACleanup();
  70. FreeLibrary((HMODULE)hndlIcmp);
  71.         return FALSE;
  72.     }
  73. return TRUE;
  74. }
  75. BOOL Ping(char* sHost)
  76. {
  77. struct in_addr iaDest; // Internet address structure
  78. DWORD dwAddress; // IP Address
  79. IPINFO ipInfo; // IP Options structure
  80. ICMPECHO icmpEcho; // ICMP Echo reply buffer
  81. HANDLE hndlFile; // Handle for IcmpCreateFile()
  82. // Lookup destination
  83.     // Use inet_addr() to determine if we're dealing with a name
  84.     // or an address
  85.     iaDest.s_addr = inet_addr(sHost);
  86. dwAddress = iaDest.s_addr;
  87. // Get an ICMP echo request handle        
  88. hndlFile = pIcmpCreateFile();
  89. // Set some reasonable default values
  90. ipInfo.Ttl = 255;
  91. ipInfo.Tos = 0;
  92. ipInfo.IPFlags = 0;
  93. ipInfo.OptSize = 0;
  94. ipInfo.Options = NULL;
  95. icmpEcho.Status = 0;
  96. // Reqest an ICMP echo
  97. pIcmpSendEcho(
  98. hndlFile, // Handle from IcmpCreateFile()
  99. dwAddress, // Destination IP address
  100. NULL, // Pointer to buffer to send
  101. 0, // Size of buffer in bytes
  102. &ipInfo, // Request options
  103. &icmpEcho, // Reply buffer
  104. sizeof(ICMPECHO),
  105. 1000); // Time to wait in milliseconds
  106. // Print the results
  107. iaDest.s_addr = icmpEcho.Source;
  108. if (icmpEcho.Status)
  109. {
  110. return FALSE;
  111. }
  112. // Close the echo request file handle
  113. pIcmpCloseHandle(hndlFile);
  114. return TRUE;
  115. }
  116. void ReleasePing()
  117. {
  118. WSACleanup();
  119. FreeLibrary((HMODULE)hndlIcmp);
  120. }