5

以下のコードを使用して、Java 1.5を使用してLinuxボックスのホスト名を出力しています

public static void main(String a[]) {
    System.out.println( InetAddress.getLocalHost().getCanonicalHostName() );
}

システムのホスト名が 64 文字の長さの文字列の場合、コードは単に「localhost.localdomain」を出力します。ホスト名の長さが 64 未満の場合、ホスト名が正しく出力されます。システムのホスト名の最大長は 64 です (getconf HOST_NAME_MAX は 64 を与えます)

ここで何が問題なのですか?これはバグでしょうか(ただし、問題は自分の側にあると思いがちです)

手伝ってくれてありがとう!

4

2 に答える 2

3

Linux で発生する可能性が高いのはInetAddress.getLocalHost()、ループバック アドレス (127/8、通常は 127.0.0.1) を返すことです。したがって、/etc/hostsファイルから取得した名前はlocalhost.localdomain.

正しいアドレス/ホスト名を取得するには、代わりに次のコードを使用できます。これにより、ネットワーク インターフェイス (私の例では) に関連付けられているすべての IP アドレスが一覧表示eth0され、属していない IPv4 が選択されます。ループバック クラス。

try {
    // Replace eth0 with your interface name
    NetworkInterface i = NetworkInterface.getByName("eth0");

    if (i != null) {

        Enumeration<InetAddress> iplist = i.getInetAddresses();

        InetAddress addr = null;

        while (iplist.hasMoreElements()) {
            InetAddress ad = iplist.nextElement();
            byte bs[] = ad.getAddress();
            if (bs.length == 4 && bs[0] != 127) {
                addr = ad;
                // You could also display the host name here, to 
                // see the whole list, and remove the break.
                break;
            }
        }

        if (addr != null) {
            System.out.println( addr.getCanonicalHostName() );
        }
    } catch (...) { ... }

すべてのアドレスを表示するようにコードを少し変更できます。コード内のコメントを参照してください。

編集

@rafalmag で提案されているように、他の NIC を反復処理することもできます。

NetworkInterface.getByName("eth0") の代わりに NetworkInterface.getNetworkInterfaces() を繰り返すことをお勧めします

于 2011-02-02T17:22:29.780 に答える
0

あなたのケースで何がうまくいかないかを推測するのは難しいですが、Java 6の対応するコードに基づくと、名前解決の問題と同じくらい単純であるか、Javaが64文字のホスト名がなりすましていると誤って考えている可能性があります。

于 2011-02-02T16:49:27.123 に答える