gpt4 book ai didi

java - 如何判断NetworkInterface对象是否属于物理网卡

转载 作者:行者123 更新时间:2023-11-30 06:58:49 31 4
gpt4 key购买 nike

如何识别 NetworkInterface 对象是否属于物理 NIC,而不是 NIC 的软件/仿真。

我知道有像 NetworkInterface#isVirtualNetworkInterface#getParent 这样的方法,理论上可以判断这是否是物理接口(interface)。

但显然这并没有给我正确的答案,因为当我使用这些方法时,我得到了低于o/p的结果,并且127.0.0.1是一个环回软件接口(interface)。

我错过了什么吗?

代码:

 Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
for (NetworkInterface netIf : Collections.list(nets)) {
System.out.printf("Display name: %s\n", netIf.getDisplayName());
System.out.printf("Name: %s\n", netIf.getName());
System.out.printf("Up? %s\n", netIf.isUp());
System.out.printf("Loopback? %s\n", netIf.isLoopback());
System.out.printf("PointToPoint? %s\n", netIf.isPointToPoint());
System.out.printf("Supports multicast? %s\n", netIf.supportsMulticast());
System.out.printf("Virtual? %s\n", netIf.isVirtual());
System.out.printf("Hardware address: %s\n", Arrays.toString(netIf.getHardwareAddress()));
System.out.printf("MTU: %s\n", netIf.getMTU());
System.out.printf("Parent: %s\n", netIf.getParent());
System.out.println("InetAddress:");
Enumeration<InetAddress> inetAddresses = netIf.getInetAddresses();
int count = 1;
for(InetAddress inetAddress : Collections.list(inetAddresses)){
System.out.println("\tInetAddress #" + count);
printInetAddressInfo(inetAddress, "\t\t");
count++;
}
System.out.println("SubInterfaces:");
displaySubInterfaces(netIf);
netIf = null;
System.out.printf("\n");
}

结果:

Display name: Software Loopback Interface 1
Name: lo
Up? true
Loopback? true
PointToPoint? false
Supports multicast? true
Virtual? false
Hardware address: null
MTU: -1
Parent: null
InetAddress:
InetAddress #1
inetAddress: /127.0.0.1
InetAddress #2
inetAddress: /0:0:0:0:0:0:0:1
SubInterfaces:

最佳答案

Am I missing something?

我认为问题在于您错误地解释了 isVirtual。 javadoc 说:

public boolean isVirtual()

Returns whether this interface is a virtual interface (also called subinterface). Virtual interfaces are, on some systems, interfaces created as a child of a physical interface and given different settings (like address or MTU). Usually the name of the interface will the name of the parent followed by a colon (:) and a number identifying the child since there can be several virtual interfaces attached to a single physical interface.

正如您所看到的,javadoc 使用“虚拟接口(interface)”来表示与“子接口(interface)”相同的事物;即与 NIC 关联的第二个 IP 地址。这与任何非物理接口(interface)不同。

127.0.0.1实际上是软件环回设备的主IP地址。这显然是一个非物理设备,但它不是某些其他主接口(interface)(无论是物理还是虚拟)的子接口(interface)。

这有点令人困惑,但“虚拟”这个词在许多与 IT 相关的环境中都是有弹性的。

根据记录,这种“子接口(interface)==虚拟接口(interface)”命名法也不是标准的。 Cisco 使用“虚拟接口(interface)”来表示“环回接口(interface)、空接口(interface)、子接口(interface)或隧道接口(interface)”;例如http://www.cisco.com/c/en/us/td/docs/ios/12_4/interface/configuration/guide/inb_virt.html#wp1027188

关于java - 如何判断NetworkInterface对象是否属于物理网卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41321150/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com