インターネットに接続せずにローカルIPアドレスを取得する 質問する

インターネットに接続せずにローカルIPアドレスを取得する 質問する

そこで、ローカル ネットワーク内のマシンの IP アドレス ( のはずです192.168.178.41) を取得しようとしています。

私の最初の意図は次のようなものを使うことでした:

InetAddress.getLocalHost().getHostAddress();

しかし、返されるのは だけであり127.0.0.1、これは正しいのですが、私にとってはあまり役に立ちません。

検索してみたらこの答えが見つかりましたhttps://stackoverflow.com/a/2381398/717341これは単に、Socket何らかの Web ページ (例: "google.com") への接続を作成し、ソケットからローカル ホスト アドレスを取得します。

Socket s = new Socket("google.com", 80);
System.out.println(s.getLocalAddress().getHostAddress());
s.close();

これは私のマシンでは機能します ( を返します192.168.178.41) が、機能するにはインターネットに接続する必要があります。私のアプリケーションはインターネット接続を必要とせず、アプリが起動するたびに Google に接続しようとするのは「疑わしい」と思われる可能性があるため、これを使用するのは好ましくありません。

そこで、さらに調査を進めた結果、NetworkInterface-class を見つけました。このクラスは (少し作業すれば) 目的の IP アドレスも返します。

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()){
    NetworkInterface current = interfaces.nextElement();
    System.out.println(current);
    if (!current.isUp() || current.isLoopback() || current.isVirtual()) continue;
    Enumeration<InetAddress> addresses = current.getInetAddresses();
    while (addresses.hasMoreElements()){
        InetAddress current_addr = addresses.nextElement();
        if (current_addr.isLoopbackAddress()) continue;
        System.out.println(current_addr.getHostAddress());
    }
}

私のマシンでは、次の結果が返されます。

name:eth1 (eth1)
fe80:0:0:0:226:4aff:fe0d:592e%3
192.168.178.41
name:lo (lo)

両方のネットワーク インターフェイスが検出され、目的の IP が返されますが、もう一方のアドレス ( ) が何を意味するのかわかりませんfe80:0:0:0:226:4aff:fe0d:592e%3

また、 RegEx を使用する以外に、返されたアドレスからそれをフィルター処理する方法 (オブジェクトisXX()のメソッドを使用する) が見つかりませんでした。これは非常に「汚い」と思います。InetAddress

RegEx またはインターネットを使用する以外の方法はありますか?

ベストアンサー1

fe80:0:0:0:226:4aff:fe0d:592e が IPv6 アドレスです ;-)。

これを確認するには

if (current_addr instanceof Inet4Address)
  System.out.println(current_addr.getHostAddress());
else if (current_addr instanceof Inet6Address)
  System.out.println(current_addr.getHostAddress());

IPv4 だけを気にするのであれば、IPv6 のケースは捨ててください。ただし、注意してください。IPv6 は未来です ^^。

PS: 一部のbreaks が s であるべきかどうか確認してくださいcontinue

おすすめ記事