java - 查询ARP缓存获取MAC ID

标签 java networking

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

另外,如果有更好的从IP地址获取MAC ID的方法,请指点。

P.S: 我在 JAVA 工作。

谢谢。

最佳答案

Java 不提供查询网络中主机 MAC 地址的直接方法,因为这是由 Java 的套接字库抽象出来的。

在某种程度上,这是有道理的,因为主机的 MAC 地址实际上说的很少。没有主机的“那个”MAC 地址这样的东西。

  • 许多主机会有多个 NIC,所有 NIC 都有一个单独的 MAC 地址,它们可以通过这些地址连接到网络。我现在使用的计算机有一个有线以太网适配器、一个 WiFi 适配器和一个 Firewire 适配器,它们都有自己的 MAC 地址。这意味着主机没有明确的 MAC 地址。
  • 如果主机位于不同的子网上,ARP 实际上会为您提供数据包通过的最后一个路由器的 MAC 地址,而不是您正在扫描的主机的 MAC 地址。

将这两个问题放在一起,这意味着一台主机可能有许多不同的 MAC 地址(如果它有多个 NIC),而一个 MAC 地址可能代表许多不同的主机(如果流量通过路由器)。

假设您知道所有这些并且您仍然需要获取主机的 MAC 地址,那么在 Java 中执行此操作的唯一方法是“本地化”:

  • 本地运行您程序的客户端:
    • 您可以启动 ARP 命令行工具并解析其输出。
    • 您可以使用某种 JNI 调用。不过,我对 JNI 不太熟悉,所以在这方面我帮不了你。
    • 编写一个单独的小型 native 应用程序,您可以通过 Telnet 或某些此类协议(protocol)从 Java 访问该应用程序,该应用程序将为您运行 ARP 命令。
  • 您要扫描的主机的原生版本:
    • 您可以使用 SNMP,正如该线程的一些其他答案所建议的那样。我尊重这些答案,以便为您工作。 SNMP 是一个很棒的协议(protocol),但请注意 SNMP 的 OID 既可以依赖于平台也可以依赖于供应商。适用于 Windows 的 OID 并不总是适用于 Linux,反之亦然。
    • 如果您知道您的主机运行的是 Windows,您可以使用 WMI . Win32_NetworkAdapter类包含您想要的信息,但请注意,这将返回所有 主机 NIC,甚至是 Windows 组成的 NIC。此外,它还需要您正在扫描的主机的管理员凭据。 Google 会告诉您如何从 Java 连接到 WMI。
    • 如果您知道您的主机运行的是 OS X,您可能能够通过 SSH 连接到机器并解析 system_profile 命令的输出。
    • 对于 Linux,可能存在类似于 OS X 的 system_profile 的工具。

关于java - 查询ARP缓存获取MAC ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1238963/

相关文章:

java - Spring 不使用 mongo 自定义转换器

linux - TcpStream 上的 std::io::BufReader 会导致数据丢失吗?

java - 如何使用 Java 获取以太网地址?

Kotlin 密封类类型检测的 Java 等价物

java - 确定从给定位置到网格边缘的最短距离

java - 如何以编程方式将 Android TextView 对齐到另一个 TextView 的右侧

java - 如何在 Java 上使用 zookeeper 客户端库递归地创建节点?

ios - 为什么我在 swift 中看不到响应值?

java - TCP 聊天服务器

c++ - Asio 解析器不将 io_service 对象作为参数