9

デバイスの IP アドレスを読み取ると、常にローカル IP アドレスが取得されます。

そのために、次のコード スニペットを使用します。

public String getIpAddress() {
   try {
         for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
                NetworkInterface intf = en.nextElement();
             for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress()) {
                        String ip = Formatter.formatIpAddress(inetAddress.hashCode());
                        Log.d("VPNConnected",ip);
                        return ip;
                    }
                }
            }

        } catch (Exception ex) {
            Log.d("exception", ex.toString());
        }
        return "EMPTY";
    }

しかし、外部ホストやhttp://jsonip.comなどの Web API を使用せずに、外部 IP アドレスを読み取る必要があります。

4

1 に答える 1

0

ほとんどの回答は完全に正しいです。最善の方法は、接続する外部サービスを用意し、このサービスがパブリック IP アドレスで応答することです。ただし、外部サービスに接続したくない理由があります。(1) 独自のサービスを実行したくない、またはサードパーティのサービスに料金を支払いたくない、(2) アプリケーションを「ステルス」モードで実行する必要がある、および時々インターネット上のサービスに連絡するだけではありません。

ただし、ここに示すような 100% 純粋な Java traceroute 実装に依存することができます: http://people.dsv.su.se/~miko1432/ip/ip1/4.3/doc/_traceroute_8java_source.html

traceroute の実装にフックすることで、インターネットへのパス上で次々とホストに ping を実行することができます。基本的にこの方法で、任意のパブリック IP アドレスに "ping" を実行するだけで、宛先までのルートを確認できます。

トレースを見ると、ネットワーク 192.168.0.0/16 や 10.0.0.0/8 などのプライベート (ルーティングされていない) IP アドレスが表示されます。これらはプライベート アドレスであり、ルートの最初のパブリック IP アドレスがパブリック IP アドレスであると安全に想定できます。

これは、クライアント デバイスにパブリック IP アドレスが割り当てられているシナリオでも機能するはずです。たとえば、一部のモバイル オペレーターやアカデミック ネットワークの場合です。

于 2014-10-06T19:53:37.140 に答える