2012-08-03 80 views
7

在Java中,我想找到與用於訪問默認網關的接口對應的java.net.NetworkInterface。接口的名稱等等,不會提前知道。Java查找默認網關的網絡接口

在其他的字,如果下面是我的路由表,我想用「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運行時必須「知道」如何得到這些信息(並不是說,它暴露)。當使用連接(InetAddress grpAddr)調用(不指定接口)將java.net.MulticastSocket加入到多播組時,顯然的行爲似乎是加入「默認」接口(如上定義)。即使默認的intf不是路由表中列出的第一個接口,它也可以工作。但是,基本的POSIX調用加入一個MCAST組需要該信息!:

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。

回答

0

據我所知,沒有好的方法可以做到這一點,因爲Java以跨平臺的方式實現這些低級細節是非常困難的。 java.net.NetworkInterface可能會有所幫助,但是如果可用的方法不夠用,則可能不得不求助於某種更醜陋的東西。

這是永久運行在指定平臺上還是需要更加便攜的東西?在最壞的情況下,您可以嘗試執行系統命令並解析輸出,但這不是非常便攜或不穩定。

一些相關的話題:

Is it possible to get the default gateway IP and MAC addresses in java?

Finding SSID of a wireless network with Java

+0

請參閱上面的編輯... – Josh 2012-08-03 15:39:43

+0

好的,我明白了你的觀點。但是,看起來這個電話仍然需要一個地址,是的? java.net.NetworkInterface可以獲得接口(和它們的地址),並且有點聰明可以決定哪一個擁有給定的地址。我認爲你的問題更復雜,因爲你首先尋找低層路由信息,然後向後尋找與(默認)路由相關的接口。 – Carl 2012-08-03 15:54:56

+0

它需要多播地址(即224.xxx-239.xxx中的特殊地址),而不是接口的地址。參數中沒有提供這樣的信息。所以「加入」呼叫必須解決的問題是一樣的。它神奇地選擇了默認路線(明顯的行爲)。同樣,我想知道哪個接口有默認路由。 – Josh 2012-08-03 16:05:10

4

我的辦法是:

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)不需要可達,只是可路由的。

+0

根據我的經驗,這不適用於windows和ipv6。 getLocalAddress返回虛假v4地址,儘管綁定爲v6套接字 – the8472 2015-02-28 12:45:00

+0

此代碼僅顯示MAC地址。 – Razavi 2016-12-11 06:25:22

+0

適用於Microsoft-android-emulator,docker和OpenVPN的Windows10和Hyper-V。 – AlexS 2017-02-10 15:51:26