加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java查找默认网关的网络接口

发布时间:2020-12-15 00:40:13 所属栏目:Java 来源:网络整理
导读:在 Java中,我想找到与所使用的接口相对应的java.net.NetworkInterface到达默认网关.接口的名称等不是提前知道的. 换句话说,如果以下是我的路由表,我希望接口对应“bond0”: $netstat -rKernel IP routing tableDestination Gateway Genmask Flags MSS Windo
在 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.

解决方法

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

由于使用数据报(UDP),它不会连接到任何地方,因此端口号可能没有意义,远程地址(1.1.1.1)无需可达,只是可路由.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读