[Java] IPアドレスが `169.254.xx.yy`になってしまう

Javaプログラムが動いているPCで、そのPCのIPアドレスを取得したい。

InetAddress.getLocalHost() で取得した InetAddressgetHostAddress() メソッドから返ってくるIPアドレスが 169.254.xx.yy (プライベートIPアドレス) になってしまう。
おそらく環境によっては結果は違う (もしかするとWindowsなら意図する動作するかも) と思う。

InetAddress.getLocalHost() は複数NICのことは考えてないのかもしれない。いまどきは仮想NICみたいなのがあるのが普通の気がするので、これでは困る。

ということで、とりあえず以下のようなテストプログラムを作成してみた。

package test;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

public class TestGetAddress {

    public static void main(String[] args) {
        TestGetAddress test = new TestGetAddress();

        test.getLocalAddress();

        test.getInterfaces();
    }

    public void getInterfaces() {
        try {
            Enumeration<NetworkInterface> list = NetworkInterface.getNetworkInterfaces();

            if (list == null) {
                return;
            }

            while(list.hasMoreElements()) {
                NetworkInterface item = list.nextElement();
                System.out.println(item.getDisplayName());

                Enumeration<InetAddress> addrList = item.getInetAddresses();

                while (addrList.hasMoreElements()) {
                    InetAddress addr = addrList.nextElement();
                    System.out.println(addr.getHostAddress());
                }
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    public void getLocalAddress() {
        try {
            InetAddress addr = InetAddress.getLocalHost();
            System.out.println(addr.getHostAddress());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

IPv6やIPv4, 127.0.0.1 や 169.254.xxx.xxx などなど、いろんなIPアドレスが列挙できた。
今回はIPv4でかつ ^127 と ^169 でないアドレスを返すようにすれば、やりたいことが達成できそう。


参考

Java: インターフェースとローカルのIPv6, IPv4アドレスの取得 – NetworkInterfaceクラス
http://www.yukun.info/blog/2010/05/java-networkinterface-ipv6-ipv4.html

コメント

このブログの人気の投稿

Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER is marked for publish/export but is not exported on the project classpath

蛍光灯フリッカー現象 (ちらつき) の対策

[node.js] CP932のテキストを読み込む