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 に答える