查询ARP缓存以获取MAC ID

bdh*_*har 13 java networking

我需要在我的网络中获取主机的MAC ID.为此,如果我ping到该IP并查询ARP缓存arp -a,我就能获得MAC ID.我只是想知道我是否可以获取任何API来查询ARP并获取MAC ID.

此外,如果有更好的方法从IP地址获取MAC ID,请建议.

PS:我在JAVA工作.

谢谢.

jqn*_*qno 10

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的工具.


T.E*_*.D. 5

ARP 是将 IP 地址映射到 MAC 地址的方法IP 堆栈就是这样做的。

我不确定是否有一种可移植的方式来获取该信息,因为它通常只对内核开发人员和系统管理员重要。

从大量的网络搜索来看,似乎可以使用 SNMP 获取路由器的 ARP 表,但我没有找到很多关于如何做到这一点的具体信息。不过,我确实在这里找到了一个免费的 SNMP Java 库。在那里进行一些洞穴探险可能会很有成效。


gre*_*and 5

有一种更简单的方法:

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 ));
Run Code Online (Sandbox Code Playgroud)

然后,您将获得具有IP和HW排序的eintire ARP表。

然后,您可以将表拆分为单独的字符串行,并在每行上使用正则表达式以匹配硬件和IP地址。这样就完成了。