【问题标题】:Java getHostAddress() Returning VirtualBox IPv4 AddressJava getHostAddress() 返回 VirtualBox IPv4 地址
【发布时间】:2012-01-03 09:58:14
【问题描述】:

我正在使用 Java 在一个类中构建一个简单的方法,该方法将获取用户机器的 LAN IPv4 地址。对于大多数部分,这很好用,除了一个例外......我得到的IP地址是我的VirtualBox以太网适配器的IPv4地址,正如我在命令提示符中输入ipconfig所证明的那样:

下面是获取IP地址的方法:

import java.net.InetAddress;
import java.net.UnknownHostException;

...

private String getIP() {
  try {
    return InetAddress.getLocalHost().getHostAddress();
  } catch (UnknownHostException e) {
    return "0.0.0.0";
  }
}

谁能告诉我如何解决这个问题?我想避免假设最终用户不会安装 VirtualBox(或类似的东西)。

感谢您的宝贵时间。

【问题讨论】:

  • 这不是和stackoverflow.com/questions/7348711/…有点重复吗?
  • 不完全。他们正在寻找主机名。我正在寻找主机地址。
  • 我能够很好地获取我的主机名...
  • 仍然,适用于获取主机名的 cmets 也适用于获取主机地址。基本上,你不能,因为你的机器可能有多个地址,或者可能被机器本身不可见的某些地址从外部知道(例如,使用 NAT 时)。

标签: java ip-address virtualbox lan ipv4


【解决方案1】:

我认为您需要查看 NetworkInterface 类,看看它是否会帮助您在这种情况下排除虚拟接口:

    for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces())) {
        //Perhaps networkInterface.isVirtual() will help you identify the correct one?
    }

我的设置中没有任何虚拟接口,所以我无法判断它的效果如何,但我希望能给你一个指导。

【讨论】:

  • 谢谢。我会调查一下,让你知道我的结果!
  • 太棒了!通过使用您和 prunge 建议的修改版本,我能够获取并解析此语句的输出,直到我只剩下我的 LAN IP 地址。谢谢!
【解决方案2】:

根据 Yishai 关于使用 NetworkInterface 类的建议,根据我的经验,isVirtual() 没有区分 VM 网络适配器和“普通”网络适配器。

但是您可以使用 NetworkInterface.getHardwareAddress() 获取 MAC 地址并进行一些模式匹配来猜测网络接口是否用于虚拟机。有关常见的虚拟机 MAC 地址模式,请参阅 this page

无法保证这种技术会奏效,因为大多数 VM 软件允许用户显式设置网络适配器的 MAC 地址。但是,在大多数情况下,用户只会让 VM 软件生成一个,因此这些模式应该涵盖大多数情况。

【讨论】:

    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2011-02-25
    • 1970-01-01
    • 2014-05-29
    • 2019-09-10
    • 2013-09-18
    相关资源
    最近更新 更多