zoukankan      html  css  js  c++  java
  • VB6之ICMP实现ping功能

    代码备忘

      1 'code by lichmama from cnblogs.com
      2 Private Type IPAddr
      3     ip1 As Byte
      4     ip2 As Byte
      5     ip3 As Byte
      6     ip4 As Byte
      7 End Type
      8  
      9 Private Type IP_OPTION_INFORMATION
     10     Ttl As Byte
     11     Tos As Byte
     12     Flags As Byte
     13     OptionsSize As Byte
     14     OptionsData As Long
     15 End Type
     16  
     17 Private Type ICMP_ECHO_REPLY
     18     Address As IPAddr
     19     Status As Long
     20     RoundTripTime As Long
     21     DataSize As Integer
     22     Reserved As Integer
     23     ptrData As Long
     24     Options As IP_OPTION_INFORMATION
     25     Data As String * 250
     26 End Type
     27  
     28 Private Const REQUEST_TIMEOUT = 11010
     29  
     30 Private Declare Sub RtlZeroMemory Lib "KERNEL32" (dest As Any, ByVal numBytes As Long)
     31 Private Declare Function IcmpCreateFile Lib "icmp.dll" () As Long
     32 Private Declare Function IcmpCloseHandle Lib "icmp.dll" (ByVal IcmpHandle As Long) As Long
     33 Private Declare Function IcmpSendEcho Lib "icmp.dll" (ByVal IcmpHandle As Long, _
     34     ByVal DestinationAddress As Long, _
     35     ByVal RequestData As String, _
     36     ByVal RequestSize As Long, _
     37     ByVal RequestOptions As Long, _
     38     ReplyBuffer As ICMP_ECHO_REPLY, _
     39     ByVal ReplySize As Long, _
     40     ByVal timeout As Long) As Long
     41 
     42 Private Const WS_VERSION_REQD = &H101
     43 Private Const WS_VERSION_MAJOR = WS_VERSION_REQD  &H100 And &HFF&
     44 Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
     45 Private Const MIN_SOCKETS_REQD = 1
     46 Private Const SOCKET_ERROR = -1
     47 Private Const WSADescription_Len = 256
     48 Private Const WSASYS_Status_Len = 128
     49 
     50 Private Type HOSTENT
     51     hName As Long
     52     hAliases As Long
     53     hAddrType As Integer
     54     hLength As Integer
     55     hAddrList As Long
     56 End Type
     57 
     58 Private Type WSADATA
     59     wversion As Integer
     60     wHighVersion As Integer
     61     szDescription(0 To WSADescription_Len) As Byte
     62     szSystemStatus(0 To WSASYS_Status_Len) As Byte
     63     iMaxSockets As Integer
     64     iMaxUdpDg As Integer
     65     lpszVendorInfo As Long
     66 End Type
     67 
     68 Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
     69 Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired As Integer, _
     70     lpwsadata As WSADATA) As Long
     71 Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
     72 Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname As String, _
     73     ByVal HostLen As Long) As Long
     74 Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname As String) As Long
     75 Private Declare Sub RtlMoveMemory Lib "KERNEL32" (hpvDest As Any, _
     76     ByVal hpvSource As Long, _
     77     ByVal cbCopy As Long)
     78 
     79 Private Function IPString2Long(ByVal ip As String) As Long
     80     For Each Item In Split(ip, ".")
     81         v = Hex(Item)
     82         If Len(v) = 1 Then v = "0" & v
     83         hex_ = v & hex_
     84     Next
     85     IPString2Long = CLng("&H" & hex_)
     86 End Function
     87 
     88 Private Function GetIpAddressByHostName(ByVal hostname As String) As String
     89     Dim lpwsadata As WSADATA
     90     Call WSAStartup(WS_VERSION_REQD, lpwsadata)
     91     
     92     Dim hostent_addr As Long
     93     Dim host As HOSTENT
     94     Dim hostip_addr As Long
     95     Dim temp_ip_addr() As Byte
     96     Dim i As Integer
     97     Dim ip_address As String
     98     hostent_addr = gethostbyname(hostname)
     99     If hostent_addr = 0 Then
    100         Exit Function
    101     End If
    102     Call RtlMoveMemory(host, hostent_addr, LenB(host))
    103     Call RtlMoveMemory(hostip_addr, host.hAddrList, 4&)
    104     Do
    105         ReDim temp_ip_address(1 To host.hLength) As Byte
    106         Call RtlMoveMemory(temp_ip_address(1), hostip_addr, host.hLength)
    107 
    108         For i = 1 To host.hLength
    109                ip_address = ip_address & temp_ip_address(i) & "."
    110         Next
    111         ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
    112         
    113         GetIpAddressByHostName = ip_address
    114         GoTo EXIT__
    115         '某些域名下可能有多个地址,但是这里获取首个地址就够了
    116         Debug.Print ip_address
    117 
    118         ip_address = ""
    119         host.hAddrList = host.hAddrList + LenB(host.hAddrList)
    120         Call RtlMoveMemory(hostip_addr, host.hAddrList, 4&)
    121     Loop While (hostip_addr <> 0)
    122 
    123 EXIT__:
    124     Erase temp_ip_address
    125     Call WSACleanup
    126 End Function
    127 
    128 Private Function Ping(ByVal ip As String, ReplyBuff As ICMP_ECHO_REPLY) As Long
    129     Dim IcmpHandle As Long
    130      
    131     IcmpHandle = IcmpCreateFile()
    132     If IcmpHandle Then
    133         Dim addr As Long
    134         Dim sendbuff As String
    135         Dim timeout As Long
    136          
    137         timeout = 1000 'set the timeout 1000ms
    138         sendbuff = String(32, &HFF)
    139         addr = IPString2Long(ip)
    140         Call RtlZeroMemory(ByVal VarPtr(ReplyBuff), Len(ReplyBuff))
    141         Call IcmpSendEcho(IcmpHandle, addr, sendbuff, Len(sendbuff), 0&, ReplyBuff, Len(ReplyBuff), timeout)
    142         Call IcmpCloseHandle(IcmpHandle)
    143         Ping = ReplyBuff.Status
    144     Else
    145         'icmp initailize fail
    146         Ping = -1
    147     End If
    148 End Function
    149  
    150 Private Sub Command1_Click()
    151     Dim ip As String
    152     Dim ier As ICMP_ECHO_REPLY
    153     ip = GetIpAddressByHostName("www.baidu.com")
    154     Call Ping(ip, ier)
    155     Debug.Print "Reply from " & ip & ": bytes=" & ier.DataSize & " times=" & ier.RoundTripTime & " ttl=" & ier.Options.Ttl
    156 End Sub

      

    Reply from 61.135.169.105: bytes=32 times=31 ttl=55
    Reply from 61.135.169.105: bytes=32 times=29 ttl=55
    Reply from 61.135.169.105: bytes=32 times=28 ttl=55
  • 相关阅读:
    UVa 11538 Chess Queen (排列组合计数)
    CodeForces 730H Delete Them (暴力)
    CodeForces 730G Car Repair Shop (暴力)
    汇编(assembling)简介(源:阮一峰)
    CSS骚操作
    Jquery复习总结
    CGI与ISAPI的区别(转)
    SQL中Group By的使用(转)
    05 ADO.net
    04 SqlServer
  • 原文地址:https://www.cnblogs.com/lichmama/p/3826565.html
Copyright © 2011-2022 走看看