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
可以去除大部分不需要的接口,但不是全部。