如有网络文件夹: \\Jessehuang\DataFile\photo\Employee那么我如何找出计算机名为 Jessehuang 的IP地址

解决方案 »

  1.   

    这是 API-Guid 中的例子,其中 gethostbyname 部分
    'In a form
    Private Sub Form_Load()
        'KPD-Team 1999
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        MsgBox "IP-address: " + GetIPAddress
    End Sub
    'In a module
    Public Const MIN_SOCKETS_REQD As Long = 1
    Public Const WS_VERSION_REQD As Long = &H101
    Public Const WS_VERSION_MAJOR As Long = WS_VERSION_REQD \ &H100 And &HFF&
    Public Const WS_VERSION_MINOR As Long = WS_VERSION_REQD And &HFF&
    Public Const SOCKET_ERROR As Long = -1
    Public Const WSADESCRIPTION_LEN = 257
    Public Const WSASYS_STATUS_LEN = 129
    Public Const MAX_WSADescription = 256
    Public Const MAX_WSASYSStatus = 128
    Public Type WSAData
        wVersion As Integer
        wHighVersion As Integer
        szDescription(0 To MAX_WSADescription) As Byte
        szSystemStatus(0 To MAX_WSASYSStatus) As Byte
        wMaxSockets As Integer
        wMaxUDPDG As Integer
        dwVendorInfo As Long
    End Type
    Type WSADataInfo
        wVersion As Integer
        wHighVersion As Integer
        szDescription As String * WSADESCRIPTION_LEN
        szSystemStatus As String * WSASYS_STATUS_LEN
        iMaxSockets As Integer
        iMaxUdpDg As Integer
        lpVendorInfo As String
    End Type
    Public Type HOSTENT
        hName As Long
        hAliases As Long
        hAddrType As Integer
        hLen As Integer
        hAddrList As Long
    End Type
    Declare Function WSAStartupInfo Lib "WSOCK32" Alias "WSAStartup" (ByVal wVersionRequested As Integer, lpWSADATA As WSADataInfo) As Long
    Declare Function WSACleanup Lib "WSOCK32" () As Long
    Declare Function WSAGetLastError Lib "WSOCK32" () As Long
    Declare Function WSAStartup Lib "WSOCK32" (ByVal wVersionRequired As Long, lpWSADATA As WSAData) As Long
    Declare Function gethostname Lib "WSOCK32" (ByVal szHost As String, ByVal dwHostLen As Long) As Long
    Declare Function gethostbyname Lib "WSOCK32" (ByVal szHost As String) As Long
    Declare Sub CopyMemoryIP Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
    Public Function GetIPAddress() As String
        Dim sHostName As String * 256
        Dim lpHost As Long
        Dim HOST As HOSTENT
        Dim dwIPAddr As Long
        Dim tmpIPAddr() As Byte
        Dim I As Integer
        Dim sIPAddr As String
        If Not SocketsInitialize() Then
            GetIPAddress = ""
            Exit Function
        End If
        If gethostname(sHostName, 256) = SOCKET_ERROR Then
            GetIPAddress = ""
            MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & " has occurred. Unable to successfully get Host Name."
            SocketsCleanup
            Exit Function
        End If
        sHostName = Trim$(sHostName)
        lpHost = gethostbyname(sHostName)
        If lpHost = 0 Then
            GetIPAddress = ""
            MsgBox "Windows Sockets are not responding. " & "Unable to successfully get Host Name."
            SocketsCleanup
            Exit Function
        End If
        CopyMemoryIP HOST, lpHost, Len(HOST)
        CopyMemoryIP dwIPAddr, HOST.hAddrList, 4
        ReDim tmpIPAddr(1 To HOST.hLen)
        CopyMemoryIP tmpIPAddr(1), dwIPAddr, HOST.hLen
        For I = 1 To HOST.hLen
            sIPAddr = sIPAddr & tmpIPAddr(I) & "."
        Next
        GetIPAddress = Mid$(sIPAddr, 1, Len(sIPAddr) - 1)
        SocketsCleanup
    End Function
    Public Function GetIPHostName() As String
        Dim sHostName As String * 256
        If Not SocketsInitialize() Then
            GetIPHostName = ""
            Exit Function
        End If
        If gethostname(sHostName, 256) = SOCKET_ERROR Then
            GetIPHostName = ""
            MsgBox "Windows Sockets error " & Str$(WSAGetLastError()) & " has occurred. Unable to successfully get Host Name."
            SocketsCleanup
            Exit Function
        End If
        GetIPHostName = Left$(sHostName, InStr(sHostName, Chr(0)) - 1)
        SocketsCleanup
    End Function
    Public Function HiByte(ByVal wParam As Integer)
        HiByte = wParam \ &H100 And &HFF&
    End Function
    Public Function LoByte(ByVal wParam As Integer)
        LoByte = wParam And &HFF&
    End Function
    Public Sub SocketsCleanup()
        If WSACleanup() <> ERROR_SUCCESS Then
            MsgBox "Socket error occurred in Cleanup."
        End If
    End Sub
    Public Function SocketsInitialize() As Boolean
        Dim WSAD As WSAData
        Dim sLoByte As String
        Dim sHiByte As String
        If WSAStartup(WS_VERSION_REQD, WSAD) <> ERROR_SUCCESS Then
            MsgBox "The 32-bit Windows Socket is not responding."
            SocketsInitialize = False
            Exit Function
        End If
        If WSAD.wMaxSockets < MIN_SOCKETS_REQD Then
            MsgBox "This application requires a minimum of " & CStr(MIN_SOCKETS_REQD) & " supported sockets."
            SocketsInitialize = False
            Exit Function
        End If
        If LoByte(WSAD.wVersion) < WS_VERSION_MAJOR Or (LoByte(WSAD.wVersion) = WS_VERSION_MAJOR And HiByte(WSAD.wVersion) < WS_VERSION_MINOR) Then
            sHiByte = CStr(HiByte(WSAD.wVersion))
            sLoByte = CStr(LoByte(WSAD.wVersion))
            MsgBox "Sockets version " & sLoByte & "." & sHiByte & " is not supported by 32-bit Windows Sockets."
            SocketsInitialize = False
            Exit Function
        End If
        'must be OK, so lets do it
        SocketsInitialize = True
    End Function
      

  2.   

    哈哈...刚刚整理好代码,却慢了一步! 有先发了!不过,都整理好了,还是发一下哈! (代码差不多,方法相同的...)'模块代码Private Const WS_VERSION_REQD = &H101
    Private Const WS_VERSION_MAJOR = WS_VERSION_REQD And &H100 And &HFF&
    Private Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF&
    Private Const MIN_SOCKETS_REQD = 1
     
    Private Const SOCKET_ERROR = -1
    Private Const WSADescription_Len = 256
    Private Const WSASYS_Status_Len = 128Private Type HOSTENT
       hname As Long
       hAliases As Long
       hAddrType As Integer
       hLength As Integer
       hAddrList As Long
    End TypePrivate Type WSADATA
       wversion As Integer
       wHighVersion As Integer
       szDescription(0 To WSADescription_Len) As Byte
       szSystemStatus(0 To WSASYS_Status_Len) As Byte
       iMaxSockets As Integer
       iMaxUdpDg As Integer
       lpszVendorInfo As Long
    End Type
    Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" (addr As Any, ByVal _
    byteslen As Integer, addrtype As Integer) As Long
    Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long
    Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
            wVersionRequired&, lpWSAData As WSADATA) As Long
    Private Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long
    Private Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal _
            hostname$) As Long
    Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, _
            ByVal hpvSource&, ByVal cbCopy&)Function hibyte(ByVal wParam As Integer)    '注释:获得整数的高位
       hibyte = wParam And &H100 And &HFF&
    End FunctionFunction lobyte(ByVal wParam As Integer)    '注释:获得整数的低位
       lobyte = wParam And &HFF&
    End FunctionPublic Function IPSocketsInitialize()
       Dim WSAD As WSADATA
       Dim iReturn As Integer
       iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
       
       Dim sLowByte As String, sHighByte As String, sMsg As String
       
       iReturn = WSAStartup(WS_VERSION_REQD, WSAD)
       
       If iReturn <> 0 Then
          MsgBox "Winsock.dll 没有反应."
          End
       End If
       
       If lobyte(WSAD.wversion) < WS_VERSION_MAJOR Or (lobyte(WSAD.wversion) = WS_VERSION_MAJOR And hibyte(WSAD.wversion) < WS_VERSION_MINOR) Then
          sHighByte = Trim$(str$(hibyte(WSAD.wversion)))
          sLowByte = Trim$(str$(lobyte(WSAD.wversion)))
          sMsg = "Windows Sockets版本 " & sLowByte & "." & sHighByte
          sMsg = sMsg & " 不被winsock.dll支持 "
          MsgBox sMsg
          End
       End If
       
       If WSAD.iMaxSockets < MIN_SOCKETS_REQD Then
          sMsg = "这个系统需要的最少Sockets数为 "
          sMsg = sMsg & Trim$(str$(MIN_SOCKETS_REQD))
          MsgBox sMsg
          End
       End If
       
    End FunctionPublic Sub SocketsCleanup()
       Dim lReturn As Long
       
       lReturn = WSACleanup()
       
       If lReturn <> 0 Then
          MsgBox "Socket错误 " & Trim$(str$(lReturn)) & " occurred in Cleanup "
          End
       End If
    End SubPublic Function GetIP(name As String) As String
       Dim hostent_addr As Long
       Dim host As HOSTENT
       Dim hostip_addr As Long
       Dim temp_ip_address() As Byte
       Dim I As Integer
       Dim ip_address As String
       
       hostent_addr = gethostbyname(name)
       
       If hostent_addr = 0 Then
          GetIP = ""                     '注释:主机名不能被解释
          Exit Function
       End If
       
       RtlMoveMemory host, hostent_addr, LenB(host)
       RtlMoveMemory hostip_addr, host.hAddrList, 4
       
       ReDim temp_ip_address(1 To host.hLength)
       RtlMoveMemory temp_ip_address(1), hostip_addr, host.hLength
       
       For I = 1 To host.hLength
          ip_address = ip_address & temp_ip_address(I) & "."
       Next
       ip_address = Mid$(ip_address, 1, Len(ip_address) - 1)
       
       GetIP = ip_addressEnd FunctionPrivate Function getname(addrstr As String) As String
        Dim hostent_addr As Long
        Dim host As HOSTENT
        Dim addr(0 To 50) As Byte
        Dim addrs As String
        Dim hname(1 To 50) As Byte
        Dim str As String
        Dim I As Integer, j As Integer
        Dim temp_int As Integer
        Dim byt As Byte
        str = Trim$(addrstr)
        I = 0
        j = 0
        Do
            temp_int = 0
            I = I + 1
            Do While Mid$(str, I, 1) >= "0" And Mid$(str, I, 1) <= "9" And I <= Len(str)
                temp_int = temp_int * 10 + Mid$(str, I, 1)
                I = I + 1
            Loop
            If temp_int <= 255 Then
                addr(j) = temp_int
                j = j + 1
            End If
        
        Loop Until Mid$(str, I, 1) <> "." Or I > Len(str) Or temp_int > 255
        If temp_int > 255 Then
            getname = "地址非法"
            Exit Function
        End If
        hostent_addr = gethostbyaddr(addr(0), j, 2)
        If hostent_addr = 0 Then
            getname = "此地址无法解析"
            Exit Function
        End If
        RtlMoveMemory host, hostent_addr, LenB(host)
        RtlMoveMemory hname(1), host.hname, 50
        j = 51
        For I = 1 To 50
            If hname(I) = 0 Then
                j = I
            End If
            If I >= j Then
                hname(I) = 32
            End If
        Next I
        getname = Trim$(StrConv(hname, vbUnicode))
    End Function
    '窗体代码
    Private Sub Command1_Click()
        Text1.Text = GetIP("www.vssky.org") 'Text1.Text = GetIP("vsnb")
    End SubPrivate Sub Form_Load()
        Call IPSocketsInitialize
    End Sub这方法,可以获取 外网域名和内网计算机名的对应的IP