在 Java 中,我想找到与使用的接口对应的 java.net.NetworkInterface 到达默认网关。接口的名称等是不知道的。
换句话说,如果下面是我的路由表,我会想要与“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。