当前位置: 首页 > 面试题库 >

查询ARP缓存以获取MAC ID

林劲
2023-03-14
问题内容

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

另外,如果有更好的方法可以从IP地址获取MAC ID,请提出建议。

PS:我在JAVA工作。

谢谢。


问题答案:

Java没有提供直接的方法来查询网络中主机的MAC地址,因为Java的套接字库已将其抽象出来。

从某种意义上说,这很有意义,因为主机的MAC地址实际上很少说。没有诸如主机的“ the” MAC地址之类的东西。

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

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

假设您了解所有这些信息,并且仍然需要获取主机的MAC地址,那么在Java中做到这一点的唯一方法是“本地化”:

  • 本机运行程序的客户端:
    • 您可以启动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的工具。


 类似资料:
  • 问题内容: 我正在使用JPA在基于Java EE的Web应用程序中加载和保留实体。Hibernate用作JPA的实现,但是我不使用特定于Hibernate的功能,而只能使用纯JPA。 这是一些DAO类的notice 方法: 方法很简单,但是有很大的缺点。每次调用该方法时,都会在JPA实现中的某处执行以下操作: JPQL表达式被解析并编译为SQL。 Statement或PreparedStateme

  • get 获取普通类型的值 // 获取key 为 gender 的数据 await this.app.redis.get('gender') type 获取数据类型 ctx.body = await this.app.redis.type('name') 返回 string lrange 获取 list 类型中所有数据 // 表示获取数组中所有的值 0 ,-1 ctx.body = await th

  • 问题内容: 一级缓存与hibernate中的查询缓存是否不同?我看过有关第一级和查询缓存的文章,所以我很困惑。 问题答案: 默认情况下,第一级缓存处于启用状态,并且基于每个会话。默认情况下,查询缓存未启用,它在多个会话之间共享,应始终与二级缓存一起使用。 要启用查询缓存,应使用以下属性:

  • 我已经阅读了很多资料,但对于hibernate二级缓存,我无法消除一个疑问。 1) 比方说,我有一个返回1000条记录的查询。(例如,从年龄 2) 场景2。假设我执行查询(例如,从年龄

  • 我尝试在项目中使用jooq,但出于性能原因,我希望缓存查询。在性能考虑部分的用户手册中,提到了查询缓存,但没有关于如何实现的示例。因此,我尝试按如下方式缓存查询(例如SimpleSelectConditionStep): 我的软件是一个多线程的web应用程序,但可以保证两个不同的线程不能同时使用相同的查询(池在再次放入池之前不会返回相同的查询)。 我知道比工厂不是一个线程安全的对象,但我想知道在代

  • 如果我试图缓存一个巨大的(例如:100GB表),当我对缓存的执行查询时,它会执行全表扫描吗?火花将如何索引数据。火花留档说: Spark SQL可以通过调用Spark,使用内存中的列格式缓存表。目录cacheTable(“tableName”)或dataFrame。缓存()。然后Spark SQL将只扫描所需的列,并将自动调整压缩以最小化内存使用和GC压力。你可以打电话给spark。目录uncac