15

マルチホームボックスで動作するはずのローカルホスト名を決定するためのコードを次に示します。

 /**
 * Work out the first local host name by iterating the network interfaces
 * 
 * @return
 * @throws SocketException
 */
private String findFirstLocalHostName() throws SocketException {

    Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces();
    while (ifaces.hasMoreElements()) {
        NetworkInterface iface = ifaces.nextElement();
        Enumeration<InetAddress> addresses = iface.getInetAddresses();
        while (addresses.hasMoreElements()) {
            InetAddress add = addresses.nextElement();
            if (!add.isLoopbackAddress() && add.isSiteLocalAddress()) {
                return add.getHostName();
            }
        }
    }
    throw new RuntimeException("Failed to determine local hostname");
}

isSiteLocalAddress を呼び出すとバグが発生しますか? この方法に関する有用な情報は見つかりませんが、IP v 6 のみに関連するものであり、非推奨になっていると感じています。

4

5 に答える 5

23

この方法は完全に非推奨ではなく、IPv6でのみ使用されているわけではありません。

IPv4には、サイトローカルアドレス用に定義された3つのネットワークアドレス範囲があります:10 / 8、172.16 / 12、および192.168/16。

読むInet4Address.isSiteLocalAddress()と、これら3つのネットワークからのアドレスがtrueこれらのメソッドに返されることがわかります。

IPv6にも同様の概念があり、ここではこれらのアドレスをunqieuローカルアドレスと呼びます。

事実上、これはあなたが持っているアドレスが間違いなく公開されていないかどうかを教えてくれます(このメソッドが戻ってもfalse、アドレスはまだ公開されていない可能性があることに注意してください)。

于 2011-04-11T09:38:33.370 に答える
1

実装を見ると…

の場合Inet4Address、それが RFC1918 の「ルーティング不可能な」アドレスの 1 つであるかどうかを確認します: 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。

の場合Inet6Address、最初の 2 オクテットをチェックして、それが実際の「サイト ローカル」アドレスかどうかを確認します。

于 2011-04-11T09:39:39.300 に答える
0

「サイト ローカル」は、プライベート IP 空間の非推奨の名前です。(多少のニュアンスはありますが、基本的には正しいです。) RFC 1918 を参照してください。

于 2011-04-15T16:13:22.773 に答える
0

LAN 通信にどの IPv6 を使用する必要があるかを判断しようとしています。

  • 私見、Inet6Address.isSiteLocalAddress()役に立たない。@tigzが言及したように、0xFEC0プレフィックスがRFC 3879によって廃止されたことを考えると。0xFEC0デバイス (Android、win、osx) に実際に(限られたテストで)があるのをまだ見ていません。

    //from java.net.Inet6Address (1.8.0_45) boolean isSiteLocalAddress() { return ((ipaddress[0] & 0xff) == 0xfe && (ipaddress[1] & 0xc0) == 0xc0); }

  • 0xFE80アドレスはトラフィックに使用されることは想定されていませんが(私の理解と読み取り(www.cisco.com)から)、単一のルーター(ping6、curl、http)とのLAN通信では機能しました。

  • 2601::/20私の LAN 通信には、Comcastの Global Unicast (パブリック IP の別名)が機能しました。したがって、これが使用する正しいアドレスであると言えます。

プレフィックス表: www.iana.org

于 2015-06-24T20:32:50.900 に答える
-1

私が知る限り、 isSiteLocalAddress メソッドは非推奨ではありません。

isSiteLocalAddress - 説明

InetAddress がサイト ローカル アドレスであるかどうかを示します。または、アドレスがサイト ローカル ユニキャスト アドレスでない場合は false。

InetAddress には 2 つの直接サブクラスもあります。

Inet4AddressInet6Address

最善の策は、JavaDocs を読むことです。

どのバージョンの JDK を使用していますか?

于 2011-04-11T09:40:20.360 に答える