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 を決定する方法を認識している必要があります。