【发布时间】:2014-09-08 08:20:51
【问题描述】:
当我读取设备的 IP 地址时,我总是得到本地 IP 地址。
我使用下面的代码 sn-p 来做到这一点。
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";
}
但我需要读取外部 IP 地址,而不使用任何外部主机或 Web api,例如 http://jsonip.com
【问题讨论】:
-
我不知道这对于任何环境都是可能的,更不用说Android了。您不知道您和外界之间有多少 NAT、防火墙、代理等。
-
@CommonsWare 我们可以使用类似 traceroute 的逻辑并寻找第一个“真实世界”IP 吗?
-
要使用
traceroute,您需要一个尝试跟踪路由的外部主机。然后,您需要自己的算法来确定“真实世界 IP”是什么。 -
@CommonsWare 然后我们将不得不寻找替代解决方案。
-
@CommonsWare 仅供参考:我们有一个 SDN 解决方案,可以根据需求阻止任何域。这就是为什么我不想在此过程中包含任何外部主机
标签: java android android-networking traceroute nat-traversal