【发布时间】:2017-01-16 18:16:50
【问题描述】:
我有以下代码,它应该只获取所有活动接口的 IPv4 地址,但它仍然在某些计算机上返回 IPv6 地址。
public static List<List> getIpAddress() {
List<String> ip = new ArrayList<>();
List<List> ipRefined = new ArrayList<>();
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iface = interfaces.nextElement();
if (iface.isLoopback() || !iface.isUp())
continue;
Enumeration<InetAddress> addresses = iface.getInetAddresses();
while(addresses.hasMoreElements()) {
ip.add(addresses.nextElement().getHostAddress());
}
}
} catch (SocketException e) {
throw new RuntimeException(e);
}
for(int x = 0; x < ip.size(); x++){
if(ip.get(x).contains("%")){
try {
if (ip.get(x + 1).contains(".")) {
List<String> tempList = new ArrayList<>();
tempList.add(ip.get(x).substring(ip.get(x).indexOf("%") + 1));
tempList.add(ip.get(x + 1));
ipRefined.add(tempList);
}
} catch (IndexOutOfBoundsException ae) {
}
}
}
return ipRefined;
}
我尝试使用System.setProperty("java.net.preferIPv4Stack" , "true"); 指定仅使用IPv4,但这只会导致getIpAddress() 返回一个空列表。我应该如何在不使用字符串操作的情况下获取活动接口的 IPv4?
编辑:
使用System.setProperty("java.net.preferIPv4Stack" , "true"); 总是会导致getIpAddress() 返回一个空列表。
【问题讨论】:
-
我不确定这一点,但是当您阅读
addresses枚举时,检查每个地址是否instanceof Inet4Address怎么样? -
我可以试试,但我认为问题在于接口只返回其 IPv6。让我快速进行一些调试。
-
看来我已经过滤了它,所以当我执行
if (ip.get(x + 1).contains("."))时只能返回 IPv4。我重写了一些代码以使用instanceof而不是contains(),但它不会改变任何东西。我将更详细地更新问题。 -
仅 IPv6 地址包含“%”,因为 IPv4 没有 scopeid。
标签: java ipv4 network-interface