使用 VB.NET 使用 MAC 个地址获取 6 个设备的 IP 地址

Get IP Addresses of 6 devices using MAC addresses using VB.NET

如果我知道 6 个设备 MAC 地址,如何修改我的代码以填充 IP 地址列表框?

我正在使用 VB.net 显示我当前的 IP 和 MAC 地址,但我想将其更改为添加到列表框以显示同一网络上的 6 台设备使用它们的 MAC 地址。由于我们无法修改 DHCP 服务器,我们只需要一种简单的方法来使用已知的 Mac 地址显示每个设备的 IP 地址。我将在代码中添加 MAC 地址。但只想在应用程序启动时填充列表框。

现有代码:

Imports System.Net
Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.IO
Imports System.Net.NetworkInformation

Public Class Form1
    Private Sub Form1_MouseClick(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
        Dim mac As String
        mac = GetMacAddress()
        Label1.Text = mac
    End Sub

    Function GetMacAddress()
        Dim nics() As NetworkInterface = NetworkInterface.GetAllNetworkInterfaces()
        Return nics(0).GetPhysicalAddress.ToString
    End Function

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Me.Close()
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        GetIPv4Address()
    End Sub
    Private Function GetIPv4Address() As String
        GetIPv4Address = String.Empty
        Dim strHostName As String = System.Net.Dns.GetHostName()
        Dim iphe As System.Net.IPHostEntry = System.Net.Dns.GetHostEntry(strHostName)

        For Each ipheal As System.Net.IPAddress In iphe.AddressList
            If ipheal.AddressFamily = System.Net.Sockets.AddressFamily.InterNetwork Then
                GetIPv4Address = ipheal.ToString()
                Label2.Text = "IP Address: " & ipheal.ToString
            End If
        Next
    End Function
End Class

提前致谢!

更新的答案 - 经过更多挖掘,我发现了下面代码的未调整版本 here 并稍微调整了一下。

您最终得到的是 IpInfo 结构的列表。这些对象中的每一个都具有 IpAddressMacAddressHostName 的不言自明的属性。您可以遍历列表和 IP 地址,匹配 mac 地址到您的列表框。

您可能需要调整 Thread.Sleep 时间间隔以确保您获得所有结果,但我希望这个新答案能帮您解决问题。

如果是这样,我建议删除有关代码不起作用的评论,以免他们混淆其他查看此答案的人。

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Net.Sockets


Public Class Form1

    Structure IpInfo
        Dim IpAddress As String
        Dim HostName As String
        Dim MacAddress As String
    End Structure

    Dim connectedIPAddresses As New List(Of IpInfo)

    Private Shared Function NetworkGateway() As String
        Dim ip As String = Nothing
        For Each f As NetworkInterface In NetworkInterface.GetAllNetworkInterfaces()
            If f.OperationalStatus = OperationalStatus.Up Then
                For Each d As GatewayIPAddressInformation In f.GetIPProperties().GatewayAddresses
                    ip = d.Address.ToString()
                Next
            End If
        Next
        Return ip
    End Function

    Public Sub Ping_all()
        Dim gate_ip As String = NetworkGateway()
        Dim array As String() = gate_ip.Split("."c)
        For i As Integer = 2 To 255
            Dim ping_var As String = array(0) & "." & array(1) & "." & array(2) & "." & i.ToString
            Ping(ping_var, 1, 1000)
        Next
        Task.WhenAll(taskList)
    End Sub

    Dim taskList As New List(Of Task)

    Public Sub Ping(ByVal host As String, ByVal attempts As Integer, ByVal timeout As Integer)
        For i As Integer = 0 To attempts - 1
            taskList.Add(Task.Run(Sub()
                                      Try
                                          Dim ping As System.Net.NetworkInformation.Ping = New System.Net.NetworkInformation.Ping()
                                          AddHandler ping.PingCompleted, AddressOf PingCompleted
                                          ping.SendAsync(host, timeout, host)
                                      Catch
                                      End Try
                                  End Sub))
        Next

    End Sub

    Private Sub PingCompleted(ByVal sender As Object, ByVal e As PingCompletedEventArgs)
        Dim ip As String = CStr(e.UserState)
        If e.Reply IsNot Nothing AndAlso e.Reply.Status = IPStatus.Success Then
            Dim hostname As String = GetHostName(ip)
            Dim macaddres As String = GetMacAddress(ip)
            Dim newIpAddress As IpInfo
            newIpAddress.IpAddress = ip
            newIpAddress.MacAddress = macaddres
            newIpAddress.HostName = hostname
            connectedIPAddresses.Add(newIpAddress)
        Else
        End If
    End Sub

    Public Function GetHostName(ByVal ipAddress As String) As String
        Try
            Dim entry As IPHostEntry = Dns.GetHostEntry(ipAddress)
            If entry IsNot Nothing Then
                Return entry.HostName
            End If
        Catch __unusedSocketException1__ As SocketException
        End Try

        Return Nothing
    End Function

    Public Function GetMacAddress(ByVal ipAddress As String) As String
        Dim macAddress As String = String.Empty
        Dim Process As System.Diagnostics.Process = New System.Diagnostics.Process()
        Process.StartInfo.FileName = "arp"
        Process.StartInfo.Arguments = "-a " & ipAddress
        Process.StartInfo.UseShellExecute = False
        Process.StartInfo.RedirectStandardOutput = True
        Process.StartInfo.CreateNoWindow = True
        Process.Start()
        Dim strOutput As String = Process.StandardOutput.ReadToEnd()
        Dim substrings As String() = strOutput.Split("-"c)
        If substrings.Length >= 8 Then
            macAddress = substrings(3).Substring(Math.Max(0, substrings(3).Length - 2)) & "-" & substrings(4) & "-" & substrings(5) & "-" & substrings(6) & "-" & substrings(7) & "-" + substrings(8).Substring(0, 2)
            Return macAddress
        Else
            Return "OWN Machine"
        End If
    End Function

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Ping_all()
        Threading.Thread.Sleep(10000)
        For Each ip As IpInfo In connectedIPAddresses
            ListBox1.Items.Add(ip.IpAddress)
        Next
    End Sub