如何在不使用外部主机的情况下以编程方式查找设备的外部IP地址?

时间:2014-07-17 12:42:35

标签: java android android-networking traceroute nat-traversal

当我读取设备的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";
    }

但是我需要在不使用任何外部主机或网络api的情况下读取外部IP地址,例如http://jsonip.com

1 个答案:

答案 0 :(得分:0)

大多数回复都是完全正确的。最好的办法是连接到外部服务,此服务将回复您的公共IP地址。但是,您有理由不想连接到外部服务(1)您根本不想运行自己的服务或支付某些第三方服务费用;(2)您的应用程序应该以“隐身”模式运行不只是偶尔联系互联网上的某些服务。

然而,您可以做的是依靠100%纯Java traceroute实现,例如此处提供的实现:http://people.dsv.su.se/~miko1432/ip/ip1/4.3/doc/_traceroute_8java_source.html

通过连接到traceroute实现,您可以在通往Internet的路径上ping一个主机。基本上这种方式你可以“ping”任意公共IP地址并查看到达目的地的路由。

如果查看跟踪,您将看到专用(非路由)IP地址,例如网络192.168.0.0/16和10.0.0.0/8中的IP地址。您可以放心地假设这些是私有地址,并且路由中的第一个公共IP地址是您的公共IP地址。

这也适用于为客户端设备分配公共IP地址的情况,例如某些移动运营商或学术网络的情况。