Java 如何识别NetworkInterface对象是否为物理NIC

Java 如何识别NetworkInterface对象是否为物理NIC,java,network-interface,Java,Network Interface,如何识别NetworkInterface对象是否属于物理NIC,而不是NIC的软件/仿真 我知道有像NetworkInterface#isVirtual和NetworkInterface#getParent这样的方法,从理论上讲,它们可以判断这是否是一个物理接口 但很明显,这并没有给我正确的答案,因为当我使用这些方法时,我会低于o/p,并且127.0.0.1是一个回环软件接口 我错过什么了吗 代码: Enumeration<NetworkInterface> nets = Netw

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

我知道有像
NetworkInterface#isVirtual
NetworkInterface#getParent
这样的方法,从理论上讲,它们可以判断这是否是一个物理接口

但很明显,这并没有给我正确的答案,因为当我使用这些方法时,我会低于o/p,并且
127.0.0.1
是一个回环软件接口

我错过什么了吗

代码:

 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:
我错过什么了吗

我认为问题在于您对
isVirtual
的解释不正确。javadoc说:

public boolean isVirtual()

返回此接口是否为虚拟接口(也称为子接口)。在某些系统上,虚拟接口是作为物理接口的子接口创建并给定不同设置(如地址或MTU)的接口。通常,接口的名称是父接口的名称,后跟冒号(:)和标识子接口的数字,因为一个物理接口可以连接多个虚拟接口

如您所见,javadoc使用“虚拟接口”来表示与“子接口”相同的含义;i、 e.与NIC关联的第二个IP地址。这与任何非物理接口不同

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

这有点让人困惑,但是“虚拟”这个词在很多与IT相关的上下文中都是有弹性的


作为记录,这种“子接口==虚拟接口”的命名法也不是标准的。Cisco使用“虚拟接口”表示“环回接口、空接口、子接口或隧道接口”;e、 g.

谢谢您提供的详细信息。那么,是否有任何API可以用来识别给定接口是否为物理NIC?好的,没有。尽管您可以同时使用
isLoopback()
isVirtual()
。(这里的一个问题是,操作系统本身可能不知道NIC是否真正是物理的;例如,在虚拟化平台上。)但为什么您需要知道NIC是否是“物理的”。。。。不管那意味着什么?我有一个测试环境。服务器(Linux box),可以使用2个FQDN访问它-比如说
abc-sit.xyz.ca
abc-sit2.xyz.ca
,我想了解该系统是有2个NIC还是只有一个,而另一个只是一个软件接口。您有没有得到关于这个问题的进一步信息?我也想知道网络适配器是否是真正的物理适配器。
netIf.getHardwareAddress()!=null
可以去除大部分不需要的接口,但不是全部。