当前位置:  开发笔记 > 编程语言 > 正文

查询ARP缓存以获取MAC ID

如何解决《查询ARP缓存以获取MACID》经验,为你挑选了2个好方法。

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

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

PS:我在JAVA工作.

谢谢.



1> jqno..:

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



2> greenspand..:

有一种更简单的方法:

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地址。这样就完成了。

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有