在Java中,我想找到与用于到达默认网关的接口相对应的java.net.NetworkInterface。 接口的名称等事先不知道。
换句话说,如果以下是我的路由表,则我将需要与“bond0”对应的接口:
换句话说,如果以下是我的路由表,则我将需要与“bond0”对应的接口:
$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.10.10.0 * 255.255.255.0 U 0 0 0 bond0
10.10.11.0 * 255.255.255.0 U 0 0 0 eth2
10.10.11.0 * 255.255.255.0 U 0 0 0 eth3
10.10.12.0 * 255.255.255.0 U 0 0 0 eth4
10.10.13.0 * 255.255.255.0 U 0 0 0 eth5
default mygateway 0.0.0.0 UG 0 0 0 bond0
在进行了一些谷歌搜索之后,我仍然没有找到任何答案。
编辑:
Java运行时必须“知道”如何获取此信息(不是说它已经公开)。使用join(InetAddress grpAddr)调用(未指定接口)将java.net.MulticastSocket加入多播组时,表面上的行为似乎是在“默认”接口上加入(如上所述)。 这即使默认intf不是路由表中列出的第一个接口也可以正常工作。 但是,加入mcast组的底层POSIX调用需要此信息!
struct ip_mreqn group;
group.imr_multiaddr = ...
group.imr_address = **address of the interface!**
setsockopty(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));
要点:提供一种加入组播组的方法,不需要使用intf,Java平台隐含地必须知道如何在每个平台上确定适当的intf。
NetworkInterface.getByInetAddress()
将返回null
。这是检测您是否拥有有效网络配置的好方法。 - Guss