【问题标题】:Get IP Addresses of 6 devices using MAC addresses using VB.NET使用 VB.NET 使用 MAC 地址获取 6 个设备的 IP 地址
【发布时间】:2018-04-18 17:57:30
【问题描述】:

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

我正在使用 VB.net 显示我当前的 IP 和 MAC 地址,但我想将其更改为添加到 ListBox 以显示同一网络上使用其 MAC 地址的 6 个设备。由于我们无法修改 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

提前致谢!

【问题讨论】:

标签: vb.net visual-studio network-programming


【解决方案1】:

更新答案 - 经过更多挖掘,我在here 下方找到了未调整的代码版本,并对其进行了一些调整。

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

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

如果是这样,我建议删除有关代码不起作用的 cmets,以免其他人在查看此答案时感到困惑。

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

【讨论】:

  • 谢谢您,但不幸的是该代码没有产生正确的结果。添加了 6 行:“APPNAME.Form2+NetworkInterfaceInfo”
  • @CJDronePilot 我已经更新了答案。该代码不是即时的,但它似乎确实有效。
  • 运行代码时出现轻微错误:System.IndexOutOfRangeException: '索引超出了数组的范围。'这里:Dim ping_var As String = array(0) & "." & array(1) & "." & array(2) & "." & i.ToString Ping(ping_var, 1, 1000)
  • 听起来是网络问题。可能是防火墙或设备/路由器上的其他安全设置。当 Line ` Dim array As String() = gate_ip.Split("."c)` 执行时,它应该返回一个 IP 地址。如果没有返回 IP 地址,那么您最终会得到一个空字符串。然后当它被拆分时,从拆分创建的数组中没有足够的元素,所以你最终会得到一个 IndexOutOfRangeExcepetion,因为发生错误的行正在尝试访问不存在的数组元素.我建议与管理网络和安全的人聊天。对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 2015-05-28
  • 1970-01-01
  • 2016-11-06
  • 2015-01-23
相关资源
最近更新 更多