You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用VB.NET修改代码,通过已知MAC地址启动时填充ListBox显示6台设备IP

VB.NET实现:启动时通过已知MAC获取同网段设备IP并填充ListBox

嘿,这需求挺常见的,咱们用ARP缓存表的方案就能轻松搞定——不用改DHCP服务器,完全靠本地系统的网络缓存来匹配MAC和IP,简单直接!

核心思路

同一局域网内,设备之间通信后,Windows系统会自动把MAC和IP的对应关系存在ARP缓存里。如果有些设备没在缓存里,咱们可以先主动ping一遍整个网段,触发ARP请求把在线设备的信息刷进缓存,再读取缓存匹配咱们预设的MAC地址就行。

具体代码实现

第一步:添加必要的命名空间

先在代码顶部导入这些,方便后续操作网络信息:

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Text.RegularExpressions

第二步:编写读取ARP缓存的方法

这个方法会遍历系统里的ARP缓存条目,找出和咱们预设MAC匹配的IP:

Private Function GetIpByMac(targetMacs As List(Of String)) As Dictionary(Of String, String)
    Dim ipMacMap As New Dictionary(Of String, String)
    
    ' 遍历所有网卡的ARP缓存
    For Each networkInterface In NetworkInterface.GetAllNetworkInterfaces()
        Try
            Dim ipProperties = networkInterface.GetIPProperties()
            For Each arpEntry In ipProperties.ArpCacheEntries
                ' 把MAC地址格式统一成XX-XX-XX-XX-XX-XX的形式
                Dim rawMac = arpEntry.PhysicalAddress.ToString().ToUpper()
                Dim formattedMac = String.Join("-", Enumerable.Range(0, rawMac.Length Step 2).Select(Function(i) rawMac.Substring(i, 2)))
                
                ' 如果当前MAC在目标列表里,就记录对应的IP
                If targetMacs.Contains(formattedMac.ToUpper()) AndAlso Not ipMacMap.ContainsKey(formattedMac) Then
                    ipMacMap.Add(formattedMac, arpEntry.Address.ToString())
                End If
            Next
        Catch ex As Exception
            ' 忽略单个网卡的异常,继续处理其他网卡
            Console.WriteLine($"读取ARP缓存时出错: {ex.Message}")
        End Try
    Next
    
    Return ipMacMap
End Function

第三步:可选(但推荐):Ping网段刷新ARP缓存

如果设备之前没和本机通信过,ARP缓存里不会有它的记录,咱们可以异步ping一遍整个网段,快速触发ARP请求:

Private Async Sub PingLocalNetworkAsync()
    ' 自动获取本机的局域网网段(比如192.168.1.x)
    Dim localIp = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(Function(ip) ip.AddressFamily = Net.Sockets.AddressFamily.InterNetwork)
    If localIp Is Nothing Then Return
    
    Dim ipSegments = localIp.ToString().Split("."c)
    Dim baseSegment = $"{ipSegments(0)}.{ipSegments(1)}.{ipSegments(2)}."
    
    ' 异步ping网段内的所有IP(1-254),避免卡住UI
    For i = 1 To 254
        Dim targetIp = baseSegment & i.ToString()
        Try
            Using ping As New Ping()
                Await ping.SendPingAsync(targetIp, 100) ' 超时100ms,快速扫描
            End Using
        Catch
            ' 忽略ping失败的情况(比如设备离线、禁用ICMP)
        End Try
    Next
End Sub

第四步:窗体启动时填充ListBox

Form_Load事件里把逻辑串起来,启动程序就自动执行:

Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 这里填你已知的6个MAC地址,格式要和上面的统一(XX-XX-XX-XX-XX-XX)
    Dim targetMacs As New List(Of String) From {
        "00-1A-2B-3C-4D-5E",
        "11-22-33-44-55-66",
        "AA-BB-CC-DD-EE-FF",
        "00-00-00-11-11-11",
        "22-22-22-33-33-33",
        "44-44-44-55-55-55"
    }
    
    ' 先ping网段刷新ARP缓存(如果确定设备已经和本机通信过,可以跳过这步)
    Await PingLocalNetworkAsync()
    
    ' 获取MAC对应的IP地址
    Dim ipMacDictionary = GetIpByMac(targetMacs)
    
    ' 填充ListBox控件
    ListBox1.Items.Clear()
    For Each mac In targetMacs
        If ipMacDictionary.ContainsKey(mac) Then
            ListBox1.Items.Add($"MAC: {mac} → IP: {ipMacDictionary(mac)}")
        Else
            ListBox1.Items.Add($"MAC: {mac} → 未找到对应IP(设备可能离线或未通信)")
        End If
    Next
End Sub

关键注意事项

  • MAC格式统一:一定要保证你预设的MAC地址格式和代码里格式化后的一致(比如都是带横杠的大写字符串),不然匹配不到
  • 权限问题:读取ARP缓存可能需要管理员权限,如果运行时出错,右键程序选择「以管理员身份运行」试试
  • 离线设备处理:如果设备离线,即使ping了也找不到IP,代码会显示「未找到对应IP」的提示
  • 网段自动适配:代码会自动识别本机的局域网网段,不用硬编码,适配不同的网络环境

内容的提问来源于stack exchange,提问作者FNDevCJ

火山引擎 最新活动