[Java] IPアドレスが `169.254.xx.yy`になってしまう
Javaプログラムが動いているPCで、そのPCのIPアドレスを取得したい。
InetAddress.getLocalHost()
で取得した InetAddress
の getHostAddress()
メソッドから返ってくる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
コメント
コメントを投稿