比如在 10.1.***.*** 这个局域网段类全部机器的IP地址
谢谢

解决方案 »

  1.   

    请问如何快速枚举局域网内所有存活主机IP
    http://sinhu.net/faq/50/197104.html
      

  2.   

    Option ExplicitPrivate Const RESOURCE_GLOBALNET As Long = &H2&
    Private Const RESOURCEDISPLAYTYPE_DIRECTORY& = &H9
    Private Const RESOURCEDISPLAYTYPE_DOMAIN& = &H1
    Private Const RESOURCEDISPLAYTYPE_FILE& = &H4
    Private Const RESOURCEDISPLAYTYPE_GENERIC& = &H0
    Private Const RESOURCEDISPLAYTYPE_GROUP& = &H5
    Private Const RESOURCEDISPLAYTYPE_NETWORK& = &H6
    Private Const RESOURCEDISPLAYTYPE_ROOT& = &H7
    Private Const RESOURCEDISPLAYTYPE_SERVER& = &H2
    Private Const RESOURCEDISPLAYTYPE_SHARE& = &H3
    Private Const RESOURCEDISPLAYTYPE_SHAREADMIN& = &H8
    Private Const RESOURCETYPE_ANY As Long = &H0&
    Private Const RESOURCETYPE_DISK As Long = &H1&
    Private Const RESOURCETYPE_PRINT As Long = &H2&
    Private Const RESOURCETYPE_UNKNOWN As Long = &HFFFF&
    Private Const RESOURCEUSAGE_ALL As Long = &H0&
    Private Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
    Private Const RESOURCEUSAGE_CONTAINER As Long = &H2&
    Private Const RESOURCEUSAGE_RESERVED As Long = &H80000000
    Private Const NO_ERROR = 0
    Private Const ERROR_MORE_DATA = 234
    Private Const RESOURCE_ENUM_ALL As Long = &HFFFF
    Private Type NETRESOURCE
        dwScope As Long
        dwType As Long
        dwDisplayType As Long
        dwUsage As Long
        sLocalName As String
        sRemoteName As String
        sComment As String
        sProvider As String
    End TypePrivate Type NETRESOURCE_BUF
        dwScope As Long
        dwType As Long
        dwDisplayType As Long
        dwUsage As Long
        pLocalName As Long
        pRemoteName As Long
        pComment As Long
        pProvider As Long
    End TypePrivate Type HOSTENT
       hName As Long
       hAliases As Long
       hAddrType As Integer
       hLen As Integer
       hAddrList As Long
    End TypePrivate Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long, ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
    Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long, lpBuffer As Any, lpBufferSize As Long) As Long
    Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
    Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (lpTo As Any, lpFrom As Any, ByVal lLen As Long)Private Declare Function gethostbyname Lib "wsock32" (ByVal hostname As String) As Long
    Private Declare Sub CopyMemoryIP Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
    Private Declare Function GetComputerNameA Lib "kernel32" (ByVal lpBuffer As String, nSize As Long) As LongDim arRES() As NETRESOURCEPublic Function GetIPFromHostName(ByVal sHostName As String) As String
        Dim ptrHosent   As Long
        Dim Host        As HOSTENT
        Dim dwIPAddr    As Long
        Dim tmpIPAddr() As Byte
        Dim i           As Integer
        Dim sIPAddr     As String
       ptrHosent = gethostbyname(sHostName & vbNullChar)
       If ptrHosent <> 0 Then
            CopyMemoryIP Host, ptrHosent, 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 - 1
                sIPAddr = sIPAddr & tmpIPAddr(i) & "."
            Next
            sIPAddr = sIPAddr & tmpIPAddr(i)
            GetIPFromHostName = sIPAddr
       End If
    End FunctionFunction GetRESServers() As Long
        Const MAX_RESOURCES = 256
        Const NOT_A_CONTAINER = -1
        Dim bFirstTime As Boolean
        Dim lReturn As Long
        Dim hEnum As Long
        Dim lCount As Long
        Dim lMin As Long
        Dim lLength As Long
        Dim l As Long
        Dim lBufferSize As Long
        Dim lLastIndex As Long
        Dim uNetApi(0 To MAX_RESOURCES) As NETRESOURCE_BUF
        Dim uNet() As NETRESOURCE
        bFirstTime = True
        Do
            If bFirstTime Then
                lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, ByVal 0&, hEnum)
                bFirstTime = False
            Else
                If uNet(lLastIndex).dwUsage And RESOURCEUSAGE_CONTAINER And _
                    Not (uNet(lLastIndex).dwDisplayType = RESOURCEDISPLAYTYPE_SERVER) Then
                    lReturn = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, RESOURCEUSAGE_ALL, uNet(lLastIndex), hEnum)
                Else
                    lReturn = NOT_A_CONTAINER
                    hEnum = 0
                End If
                lLastIndex = lLastIndex + 1
            End If
            If lReturn = NO_ERROR Then
                lCount = RESOURCE_ENUM_ALL
                Do
                    lBufferSize = UBound(uNetApi) * Len(uNetApi(0)) / 2
                    lReturn = WNetEnumResource(hEnum, lCount, uNetApi(0), lBufferSize)
                    If lCount > 0 Then
                        ReDim Preserve uNet(0 To lMin + lCount - 1) As NETRESOURCE
                        For l = 0 To lCount - 1
                            uNet(lMin + l).dwScope = uNetApi(l).dwScope
                            uNet(lMin + l).dwType = uNetApi(l).dwType
                            uNet(lMin + l).dwDisplayType = uNetApi(l).dwDisplayType
                            uNet(lMin + l).dwUsage = uNetApi(l).dwUsage
                            If uNetApi(l).pLocalName Then
                                lLength = lstrlen(uNetApi(l).pLocalName)
                                uNet(lMin + l).sLocalName = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sLocalName, ByVal uNetApi(l).pLocalName, lLength
                            End If
                            If uNetApi(l).pRemoteName Then
                                lLength = lstrlen(uNetApi(l).pRemoteName)
                                uNet(lMin + l).sRemoteName = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sRemoteName, ByVal uNetApi(l).pRemoteName, lLength
                            End If
                            If uNetApi(l).pComment Then
                                lLength = lstrlen(uNetApi(l).pComment)
                                uNet(lMin + l).sComment = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sComment, ByVal uNetApi(l).pComment, lLength
                            End If
                            If uNetApi(l).pProvider Then
                                lLength = lstrlen(uNetApi(l).pProvider)
                                uNet(lMin + l).sProvider = Space$(lLength)
                                CopyMem ByVal uNet(lMin + l).sProvider, ByVal uNetApi(l).pProvider, lLength
                            End If
                        Next l
                    End If
                    lMin = lMin + lCount
                Loop While lReturn = ERROR_MORE_DATA
            End If
            If hEnum Then
                l = WNetCloseEnum(hEnum)
            End If
        Loop While lLastIndex < lMin
        lReturn = 0
        If UBound(uNet) >= 0 Then
            For l = 0 To UBound(uNet)
                If uNet(l).dwDisplayType = RESOURCEDISPLAYTYPE_SERVER Then
                    lReturn = lReturn + 1
                    ReDim Preserve arRES(1 To lReturn) As NETRESOURCE
                    arRES(lReturn) = uNet(l)
                End If
            Next l
        End If
        GetRESServers = lReturn
    End FunctionPrivate Sub Command1_Click()
        Dim i As Integer
        If GetRESServers() <= 0 Then Exit Sub
        For i = 1 To UBound(arRES)
            Debug.Print GetIPFromHostName(Replace(arRES(i).sRemoteName, "\\", "")) & vbCrLf
        Next i
    End Sub
      

  3.   

    http://www.book23.com/ask34/how143101.htm
    这个里面有。
      

  4.   

    论坛上搜索了一下,这个IP和MAC全有了:Private Const NO_ERROR = 0
    Private Declare Function inet_addr Lib "wsock32.dll" (ByVal s As String) As Long
    Private Declare Function SendARP Lib "iphlpapi.dll" (ByVal DestIP As Long, ByVal SrcIP As Long, pMacAddr As Long, PhyAddrLen As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal bcount As Long)
           
    Private Function GetRemoteMACAddress(ByVal sRemoteIP As String, strMACadd As String) As Boolean
        Dim dwRemoteIP    As Long
        Dim pMacAddr      As Long
        Dim bpMacAddr()   As Byte
        Dim PhyAddrLen    As Long
        Dim cnt           As Long
        Dim tmp           As String
             
        dwRemoteIP = inet_addr(sRemoteIP)
           
        If dwRemoteIP <> 0 Then
            'set  PhyAddrLen  to  6
            PhyAddrLen = 6
            'retrieve  the  remote  MAC  address
            If SendARP(dwRemoteIP, 0&, pMacAddr, PhyAddrLen) = NO_ERROR Then
                If pMacAddr <> 0 And PhyAddrLen <> 0 Then
                    'returned  value  is  a  long  pointer
                    'to  the  mac  address,  so  copy  data
                    'to  a  byte  array
                    ReDim bpMacAddr(0 To PhyAddrLen - 1)
                    CopyMemory bpMacAddr(0), pMacAddr, ByVal PhyAddrLen
                    'loop  through  array  to  build  string
                    For cnt = 0 To PhyAddrLen - 1
                        If bpMacAddr(cnt) = 0 Then
                            tmp = tmp & "00-"
                        Else
                            tmp = tmp & Hex$(bpMacAddr(cnt)) & "-"
                        End If
                    Next
                    'remove  the  trailing  dash
                    'added  above  and  return  True
                    If Len(tmp) > 0 Then
                        strMACadd = Left$(tmp, Len(tmp) - 1)
                        GetRemoteMACAddress = True
                    End If
                    Exit Function
                Else
                    GetRemoteMACAddress = False
                End If
            Else
                GetRemoteMACAddress = False
            End If     'SendARP
        Else
            GetRemoteMACAddress = False
        End If     'dwRemoteIP
        
    End Function
      

  5.   

    如果你是问我,我给的只是一个函数,在窗体上加一个Command,一个List :Private Sub Command1_Click()
        Dim strMACadd   As String
        Dim strIP       As String
        Dim i           As Integer
            
        For i = 0 To 255
            DoEvents
            strIP = "192.168.1." & i
            strIP = CStr(strIP)
            If GetRemoteMACAddress(strIP, strMACadd) Then
                List1.AddItem strIP & " / " & strMACadd
            End If
        Next i
        MsgBox "扫描完毕!", vbOKOnly + vbExclamation 
    End Sub