在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。
請參閱上面的編輯... – Josh 2012-08-03 15:39:43
好的,我明白了你的觀點。但是,看起來這個電話仍然需要一個地址,是的? java.net.NetworkInterface可以獲得接口(和它們的地址),並且有點聰明可以決定哪一個擁有給定的地址。我認爲你的問題更復雜,因爲你首先尋找低層路由信息,然後向後尋找與(默認)路由相關的接口。 – Carl 2012-08-03 15:54:56
它需要多播地址(即224.xxx-239.xxx中的特殊地址),而不是接口的地址。參數中沒有提供這樣的信息。所以「加入」呼叫必須解決的問題是一樣的。它神奇地選擇了默認路線(明顯的行爲)。同樣,我想知道哪個接口有默認路由。 – Josh 2012-08-03 16:05:10