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";
    }

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

4

1 回答 1

0

大多数回复是完全正确的。最好的办法是让您连接到一个外部服务,该服务使用您的公共 IP 地址回复。但是,您不想连接到外部服务是有原因的(1)您只是不想运行自己的服务或为某些 3rd 方服务付费,以及(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 地址的情况,例如某些移动运营商或学术网络的情况。

于 2014-10-06T19:53:37.140 回答