如何用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




