6

バージョン 4 または 6 形式の IP を指定すると、その FQDN を返す Java を使用して単純なプログラムを作成しようとしています。次のコードは、ipv4 アドレスが指定された場合は問題なく動作しますが、ipv6 アドレスが入力された場合にのみ、指定されたアドレスを返します。

InetAddress inet;
try { inet = InetAddress.getByName(theIpAddress); }
catch(UnknownHostException e) { System.out.println("Unknown Host"); return; }

System.out.println(inet.getHostAddress(););
System.out.println(inet.getHostName(););

ipv6 getHostName() を入力すると、ipv6 が FQDN に解決されることがわかっている場合でも、同じ ipv6 のみが返されます。また、ipv6.google.com などの ipv6 ホスト名を IpAddress の代わりに入力すると、例外が発生します。

私はこのようなことに慣れていないので、助けていただければ幸いです。ありがとう。

4

4 に答える 4

2

問題は、実際に実行していた Java のバージョンにありました。Java を 1.6.21 から 1.6.23 に更新すると、ipv6s が FQDN に解決できるようになりました。

于 2011-01-05T20:59:41.140 に答える
1

inet.getCanonicalHostName();「このIPアドレスの完全修飾ドメイン名を取得する」を試してください。

を使用してInetAddressを作成するとInetAddress.getByName()getHostName()作成した内容が返されます。 getCanonicalHostName()名前の逆ルックアップを強制します。

于 2011-01-03T23:52:25.470 に答える
-2

を使用java.net.InetAddressすると、ipv6やipv4の名前解決などを行うことはできません。etcなどの静的メソッドの束は、そのgetByNameインスタンスにルックアップを委任します。Inet4(or 6)AddressImpl

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException;

ここでの楽しみは、a)これらはすべてプライベート/パッケージローカルであるため、implクラスをInetAddressクラスに注入する方法はありません。b)Inet4(または6)AddressImplクラス自体はパッケージローカルです。したがって、言う方法はありません。その場でipv4またはipv6ルックアップ/名前解決を実行します。これらのクラスですべての拡張ポイントがブロックされ、使用と柔軟性が非常に制限されている方法がわかりません。ここで本当の黒魔術が起こります。ここでは、InetAddressクラスがimplを静的に初期化しますが、メソッドの結果はIPv6Supported()に依存しますか?私のLinuxセットアップはipv6をサポートしています。ipv6.google.comのようなipv6ホスト名のDNSルックアップを実行できます。誰かがルックアップなどのipv4/v6ユーティリティ用のJavaの優れたネットライブラリの方向性を教えてくれれば幸いです。

class InetAddressImplFactory {

    static InetAddressImpl create() {
    Object o;
    if (isIPv6Supported()) {
        o = InetAddress.loadImpl("Inet6AddressImpl");
    } else {
        o = InetAddress.loadImpl("Inet4AddressImpl");
    }
    return (InetAddressImpl)o;
    }

    static native boolean isIPv6Supported();
}
于 2011-03-14T13:00:54.400 に答える