我需要在我的网络中获取主机的MAC ID.为此,如果我ping到该IP并查询ARP缓存arp -a
,我就能获得MAC ID.我只是想知道我是否可以获取任何API来查询ARP并获取MAC ID.
此外,如果有更好的方法从IP地址获取MAC ID,请建议.
PS:我在JAVA工作.
谢谢.
Java没有提供直接查询网络中主机MAC地址的方法,因为它被Java的套接字库抽象出来.
在某种程度上,这是有道理的,因为主机的MAC地址实际上说的很少.没有主机的"MAC"地址.
许多主机将具有多个NIC,所有NIC都具有单独的MAC地址,可以使用这些NIC连接到网络.我现在使用的计算机有一个有线以太网适配器,一个WiFi适配器和一个Firewire适配器,它们都有自己的MAC地址.这意味着主机没有明确的MAC地址.
如果主机位于不同的子网上,ARP实际上会为您提供数据包通过的最后一个路由器的MAC地址,而不是您正在扫描的主机的MAC地址.
将这两个问题放在一起,这意味着一个主机可能有许多不同的MAC地址(如果它有多个NIC),并且一个MAC地址可能代表许多不同的主机(如果流量通过路由器).
假设您知道所有这些并且您仍然需要获取主机的MAC地址,那么在Java中执行此操作的唯一方法是"go native":
原生于运行程序的客户端:
您可以启动ARP命令行工具并解析其输出.
你可以使用某种JNI调用.不过,我对JNI并不太熟悉,所以我无法帮助你.
编写一个单独的小型本机应用程序,您可以通过Telnet或某些此类协议从Java访问,它将为您运行ARP命令.
您要扫描的主机的原生:
您可以使用SNMP,因为此线程的其他一些答案建议.我将这些答案推迟给你.SNMP是一个很好的协议,但要注意SNMP的OID可以依赖于平台,也可以依赖于供应商.适用于Windows的OID并不总是适用于Linux,反之亦然.
如果您知道主机运行Windows,则可以使用WMI.该Win32_NetworkAdapter类拥有你想要的信息,但要注意,这将返回所有的主机网卡,即使是那些视窗组成.此外,它需要您正在扫描的主机的管理员凭据.Google将告诉您如何从Java连接到WMI.
如果您知道主机运行OS X,则可以通过SSH连接到计算机并解析system_profile
命令的输出.
对于Linux,system_profile
可能存在类似于OS X的工具.
有一种更简单的方法:
private static final String ARP_GET_IP_HW = "arp -a"; public String getARPTable(String cmd) throws IOException { Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A"); return s.hasNext() ? s.next() : ""; } System.out.println(getARPTable(ARP_GET_IP_HW ));
然后,您将获得具有IP和HW排序的eintire ARP表。
然后,您可以将表拆分为单独的字符串行,并在每行上使用正则表达式以匹配硬件和IP地址。这样就完成了。