7

在 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。

4

2 回答 2

6

我的方法是:

try(DatagramSocket s=new DatagramSocket())
{
    s.connect(InetAddress.getByAddress(new byte[]{1,1,1,1}), 0);
    return NetworkInterface.getByInetAddress(s.getLocalAddress()).getHardwareAddress();
}

因为使用数据报(UDP),它没有连接到任何地方,所以端口号可能没有意义,远程地址(1.1.1.1)不需要可达,只是可路由的。

于 2014-11-19T14:38:15.490 回答
0

据我所知,不会有什么好的方法可以做到这一点,因为这样的底层细节对于 Java 来说很难以跨平台的方式实现。java.net.NetworkInterface 可能会有所帮助,但如果可用的方法还不够,您可能不得不求助于一些更丑陋的东西。

这是永远在指定平台上运行的东西,还是需要更便携?在最坏的情况下,您可以尝试执行系统命令并解析输出,但这不是很便携或稳定。

一些相关主题:

是否可以在java中获取默认网关IP和MAC地址?

使用 Java 查找无线网络的 SSID

于 2012-08-03T14:57:40.873 回答