IPHostResolver.cls
上传用户:gzgold
上传日期:2013-02-21
资源大小:36k
文件大小:7k
源码类别:

多显示器编程

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "IPHostResolver"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. Option Explicit
  17. Private mbInitialized As Boolean
  18. Private dictCache As New Dictionary
  19. Private intMaxCacheSize As Integer
  20. Const WSADescription_Len = 256
  21. Const WSASYS_Status_Len = 128
  22. Const AF_INET = 4&
  23. Private Type HOSTENT
  24.   hName As Long
  25.   hAliases As Long
  26.   hAddrType As Integer
  27.   hLength As Integer
  28.   hAddrList As Long
  29. End Type
  30. Private Type WSADATA
  31.   wversion As Integer
  32.   wHighVersion As Integer
  33.   szDescription(0 To WSADescription_Len) As Byte
  34.   szSystemStatus(0 To WSASYS_Status_Len) As Byte
  35.   iMaxSockets As Integer
  36.   iMaxUdpDg As Integer
  37.   lpszVendorInfo As Long
  38. End Type
  39. Private Declare Function WSAStartup _
  40.                                 Lib "wsock32" _
  41.                                 (ByVal VersionReq As Long, _
  42.                                 WSADataReturn As WSADATA) _
  43.                                 As Long
  44. Private Declare Function WSACleanup _
  45.                                 Lib "wsock32" _
  46.                                 () _
  47.                                 As Long
  48. Private Declare Function WSAGetLastError _
  49.                                 Lib "wsock32" _
  50.                                 () _
  51.                                 As Long
  52. Private Declare Function gethostbyaddr _
  53.                                 Lib "wsock32" _
  54.                                 (addr As Long, _
  55.                                 addrLen As Long, _
  56.                                 addrType As Long) _
  57.                                 As Long
  58. Private Declare Function gethostbyname _
  59.                                 Lib "wsock32" _
  60.                                 (ByVal hostname As String) _
  61.                                 As Long
  62. Private Declare Sub RtlMoveMemory _
  63.                                 Lib "kernel32" _
  64.                                 (hpvDest As Any, _
  65.                                 ByVal hpvSource As Long, _
  66.                                 ByVal cbCopy As Long)
  67. 'checks if string is valid IP address
  68. Private Function CheckIP(IPToCheck As String) As Boolean
  69.   Dim TempValues
  70.   Dim iLoop As Long
  71.   Dim TempByte As Byte
  72.   
  73.   On Error GoTo CheckIPError
  74.   
  75.   TempValues = Split(IPToCheck, ".")
  76.   
  77.   If UBound(TempValues) < 3 Then
  78.     Exit Function
  79.   End If
  80.   
  81.   For iLoop = LBound(TempValues) To UBound(TempValues)
  82.     TempByte = TempValues(iLoop)
  83.   Next iLoop
  84.   CheckIP = True
  85.   
  86. CheckIPError:
  87. End Function
  88. 'converts IP address from string to sin_addr
  89. Private Function MakeIP(strIP As String) As Long
  90.     
  91.   Dim vTemp
  92.   Dim lngTemp As Long
  93.   Dim iLoop As Long
  94.   
  95.   On Error GoTo MakeIPError
  96.   
  97.   vTemp = Split(strIP, ".")
  98.   
  99.   For iLoop = 0 To (UBound(vTemp) - 1)
  100.     lngTemp = lngTemp + (vTemp(iLoop) * (256 ^ iLoop))
  101.   Next iLoop
  102.   
  103.   If vTemp(UBound(vTemp)) < 128 Then
  104.     lngTemp = lngTemp + (vTemp(UBound(vTemp)) * (256 ^ 3))
  105.   Else
  106.     lngTemp = lngTemp + ((vTemp(UBound(vTemp)) - 256) * (256 ^ 3))
  107.   End If
  108.   
  109.   MakeIP = lngTemp
  110. MakeIPError:
  111. End Function
  112. 'resolves IP address to host name
  113. Private Function AddrToName(strAddr As String) As String
  114.   
  115.   Dim heEntry As HOSTENT
  116.   Dim strHost As String * 255
  117.   Dim strTemp As String
  118.   Dim lngRet As Long
  119.   Dim lngIP As Long
  120.   
  121.   On Error GoTo AddrToNameError
  122.   
  123.   If CheckIP(strAddr) Then
  124.     lngIP = MakeIP(strAddr)
  125.     lngRet = gethostbyaddr(lngIP, 4, AF_INET)
  126.     If lngRet = 0 Then
  127.       Exit Function
  128.     End If
  129.     RtlMoveMemory heEntry, lngRet, Len(heEntry)
  130.     RtlMoveMemory ByVal strHost, heEntry.hName, 255
  131.     strTemp = TrimNull(strHost)
  132.     AddrToName = strTemp
  133.   End If
  134. AddrToNameError:
  135. End Function
  136. 'resolves host name to IP address
  137. Private Function NameToAddr(ByVal strHost As String)
  138.   
  139.   Dim ip_list() As Byte
  140.   Dim heEntry As HOSTENT
  141.   Dim strIPAddr As String
  142.   Dim lp_HostEnt As Long
  143.   Dim lp_HostIP As Long
  144.   Dim iLoop As Integer
  145.   
  146.   On Error GoTo NameToAddrError
  147.   
  148.   lp_HostEnt = gethostbyname(strHost)
  149.   
  150.   If lp_HostEnt = 0 Then
  151.     Exit Function
  152.   End If
  153.   
  154.   RtlMoveMemory heEntry, lp_HostEnt, LenB(heEntry)
  155.   RtlMoveMemory lp_HostIP, heEntry.hAddrList, 4
  156.   
  157.   ReDim ip_list(1 To heEntry.hLength)
  158.   
  159.   RtlMoveMemory ip_list(1), lp_HostIP, heEntry.hLength
  160.   
  161.   For iLoop = 1 To heEntry.hLength
  162.     strIPAddr = strIPAddr & ip_list(iLoop) & "."
  163.   Next
  164.   
  165.   strIPAddr = Mid(strIPAddr, 1, Len(strIPAddr) - 1)
  166.   
  167.   NameToAddr = strIPAddr
  168. NameToAddrError:
  169.   
  170. End Function
  171. Public Function AddressToName(strIP As String) As String
  172.     Dim strCache As String
  173.     If mbInitialized Then
  174.         On Error Resume Next
  175.         If dictCache.Exists(strIP) Then
  176.             AddressToName = dictCache(strIP)
  177.         Else
  178.             Err.Clear
  179.             AddressToName = AddrToName(strIP)
  180.             dictCache.Add strIP, AddressToName
  181.             While dictCache.Count > intMaxCacheSize
  182.                 dictCache.Remove dictCache.Keys(UBound(dictCache.Items))
  183.             Wend
  184.         End If
  185.     End If
  186. End Function
  187. Public Function NameToAddress(strName As String) As String
  188.   Dim strCache As String
  189.   
  190.   If mbInitialized Then
  191.     NameToAddress = NameToAddr(strName)
  192.   End If
  193. End Function
  194. Private Function TrimNull(sTrim As String) As String
  195.   Dim iFind As Long
  196.   iFind = InStr(1, sTrim, Chr(0))
  197.   If iFind > 0 Then
  198.     TrimNull = Left(sTrim, iFind - 1)
  199.   Else
  200.     TrimNull = sTrim
  201.   End If
  202. End Function
  203. Private Sub Class_Initialize()
  204.   Dim wsa As WSADATA
  205.   Dim ff As Byte
  206.   Dim strIP As String, strDomain As String
  207.   
  208.   mbInitialized = (WSAStartup(257, wsa) = 0)
  209.   intMaxCacheSize = Val(GetSetting(App.ProductName, "Cache", "MaxSize", 100))
  210.   
  211.   'Read in the cache file
  212.   ff = FreeFile
  213.   On Error Resume Next
  214.   Open GetSetting(App.ProductName, "Cache", "Filename", App.Path & "cache.dat") For Input As #ff
  215.     While Not EOF(ff)
  216.         Input #ff, strIP, strDomain
  217.         dictCache.Add strIP, strDomain
  218.     Wend
  219.   Close #ff
  220. End Sub
  221. Private Sub Class_Terminate()
  222.   Dim ff As Byte
  223.   Dim strKey As Variant
  224.   
  225.   If mbInitialized Then
  226.     WSACleanup
  227.     
  228.     'Save the cache to a file
  229.     ff = FreeFile
  230.     Open GetSetting(App.ProductName, "Cache", "Filename", App.Path & "cache.dat") For Output As #ff
  231.         For Each strKey In dictCache.Keys
  232.             Print #ff, strKey & "," & dictCache(strKey)
  233.         Next
  234.     Close #ff
  235.   End If
  236. End Sub