前段时间,搞个小程序要用到,就综合网上的自己改写了一段,很简单,自己看看吧。

生效范围只有在局域网中,原因很简单,因为在广域网上是无法获知远端的MAC地址的,因为在数据包中的数据链路层包含的只是近端路由器的MAC地址,而你的数据包在互联网上传播,早经过了无数路由器,最后到达你这里的数据包中,只含有最后一个路由器的MAC地址,也就是离你最近的那台路由器。

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 CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" (dst As Any, src As Any, ByVal bcount As Long)

Public Function GetRemoteMACAddress(ByVal sRemoteIP As String) As String
    'VB 获取局域网中指定IP地址的 Mac 地址
    Dim dwRemoteIP As Long, pMacAddr As Long, bpMacAddr() As Byte, PhyAddrLen As Long, cnt As Long, tmp As String
    dwRemoteIP = inet_addr(sRemoteIP)
    If dwRemoteIP <> 0 Then
        PhyAddrLen = 6
        'On Error Resume Next
        If SendARP(dwRemoteIP, 0&, pMacAddr, PhyAddrLen) = 0 Then
            If pMacAddr <> 0 And PhyAddrLen <> 0 Then
                ReDim bpMacAddr(0 To PhyAddrLen - 1)
                CopyMemory1 bpMacAddr(0), pMacAddr, ByVal PhyAddrLen
                For cnt = 0 To PhyAddrLen - 1
                    If bpMacAddr(cnt) = 0 Then
                        tmp = tmp & "00-"
                    Else
                        If Len(Hex$(bpMacAddr(cnt))) = 1 Then
                            tmp = tmp & "0" & Hex$(bpMacAddr(cnt)) & "-"
                        Else
                            tmp = tmp & Hex$(bpMacAddr(cnt)) & "-"
                        End If
                    End If
                Next
                If Len(tmp) > 0 Then
                    GetRemoteMACAddress = Left$(tmp, Len(tmp) - 1)
                End If
                Exit Function
            Else
                GetRemoteMACAddress = "00-00-00-00-00-00"
            End If
        Else
            GetRemoteMACAddress = "00-00-00-00-00-00"
        End If                                                                  'SendARP
    Else
        GetRemoteMACAddress = "00-00-00-00-00-00"
    End If                                                                      'dwRemoteIP
End Function