我怎样才能只获得 IPv4 地址
How would I get only IPv4 addresses
我有以下代码,它应该只获取所有活动接口的 IPv4 地址,但在某些计算机上它仍然 return 是 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()
到 return 一个空列表。我应该如何在不使用字符串操作的情况下获取活动接口的 IPv4?
编辑:
使用 System.setProperty("java.net.preferIPv4Stack" , "true");
总是会导致 getIpAddress()
到 return 一个空列表。
This class represents a Network Interface address. In short it's an IP address, a subnet mask and a broadcast address when the address is an IPv4 one. An IP address and a network prefix length in the case of IPv6 address.
这是我的代码:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
System.out.println(String.format("networkInterface: %s", networkInterface.toString()));
if (!networkInterface.isUp()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
int npf = interfaceAddress.getNetworkPrefixLength();
InetAddress address = interfaceAddress.getAddress();
InetAddress broadcast = interfaceAddress.getBroadcast();
if (broadcast == null && npf != 8) {
System.out.println(String.format("IPv6: %s; Network Prefix Length: %s", address, npf));
} else {
System.out.println(String.format("IPv4: %s; Subnet Mask: %s; Broadcast: %s", address, npf, broadcast));
}
}
}
我的 Kotlin 解决方案:
private suspend fun getAllActiveInterfaces(): Sequence<NetworkInterface> {
return withContext(Dispatchers.IO) {
NetworkInterface
.getNetworkInterfaces()
.asSequence()
.filter { !it.isLoopback && it.isUp && !blackListedInterfaces.contains(it.name) }
}
}
suspend fun getAllAddresses(): Result<Collection<InetAddress>> {
return withContextCatching(Dispatchers.IO) {
getAllActiveInterfaces()
.map { networkInterface ->
networkInterface
.also { Timber.d("Interface: ${it.name}") }
.interfaceAddresses
.mapNotNull { it.address }
.filterIsInstance<Inet4Address>()
}
.flatten()
.toSet()
}
}
private val blackListedInterfaces = setOf("dummy0")
我有以下代码,它应该只获取所有活动接口的 IPv4 地址,但在某些计算机上它仍然 return 是 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()
到 return 一个空列表。我应该如何在不使用字符串操作的情况下获取活动接口的 IPv4?
编辑:
使用 System.setProperty("java.net.preferIPv4Stack" , "true");
总是会导致 getIpAddress()
到 return 一个空列表。
This class represents a Network Interface address. In short it's an IP address, a subnet mask and a broadcast address when the address is an IPv4 one. An IP address and a network prefix length in the case of IPv6 address.
这是我的代码:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
System.out.println(String.format("networkInterface: %s", networkInterface.toString()));
if (!networkInterface.isUp()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
int npf = interfaceAddress.getNetworkPrefixLength();
InetAddress address = interfaceAddress.getAddress();
InetAddress broadcast = interfaceAddress.getBroadcast();
if (broadcast == null && npf != 8) {
System.out.println(String.format("IPv6: %s; Network Prefix Length: %s", address, npf));
} else {
System.out.println(String.format("IPv4: %s; Subnet Mask: %s; Broadcast: %s", address, npf, broadcast));
}
}
}
我的 Kotlin 解决方案:
private suspend fun getAllActiveInterfaces(): Sequence<NetworkInterface> {
return withContext(Dispatchers.IO) {
NetworkInterface
.getNetworkInterfaces()
.asSequence()
.filter { !it.isLoopback && it.isUp && !blackListedInterfaces.contains(it.name) }
}
}
suspend fun getAllAddresses(): Result<Collection<InetAddress>> {
return withContextCatching(Dispatchers.IO) {
getAllActiveInterfaces()
.map { networkInterface ->
networkInterface
.also { Timber.d("Interface: ${it.name}") }
.interfaceAddresses
.mapNotNull { it.address }
.filterIsInstance<Inet4Address>()
}
.flatten()
.toSet()
}
}
private val blackListedInterfaces = setOf("dummy0")