无需调用外部服务器即可获取 Internet ip
Posted
技术标签:
【中文标题】无需调用外部服务器即可获取 Internet ip【英文标题】:Getting the internet ip without calling an external server 【发布时间】:2018-12-11 08:25:09 【问题描述】:我正在开发一个需要获取互联网 IP 的 android 应用程序。是否可以在不调用外部服务器的情况下获得 Internet IP?
如果可能,如何在不发出额外网络请求的情况下获取 Internet IP?
【问题讨论】:
你可以查看这个链接,找到你的答案***.com/questions/3097589/… 我想你可以从***.com/questions/3097589/…下面的这个网址找到答案 我想你可以从***.com/questions/3097589/…下面的这个网址找到答案 【参考方案1】:如果不向外部服务器发出请求,您可能无法获取您的公共 IP 地址,因为您的设备位于 LAN 内,它不关心路由器到 Internet 的公共 IP 地址,因为它不不需要它!
我建议您使用http://checkip.amazonaws.com/ 等网络服务来满足您的需求。
URL getIP = new URL("http://checkip.amazonaws.com/");
BufferedReader getIPReader = new BufferedReader(new InputStreamReader(getIP.openStream()));
System.out.println(getIPReader.readLine()); // prints the IP
【讨论】:
如果您想使用更灵活的 API,请查看ipify。页面上甚至还有一个 Java 使用示例。 ;) 如果您想检查 IPv4 和/或 IPv6,我建议您查看 api.ident.me【参考方案2】:老问题,但在其他任何地方都没有找到任何合理的答案......
仅使用本地资源获取您的公共 IP
此方法尝试尽可能通用,即使您在 NAT 主机之前的多个跃点处也可以工作。此示例在 bash 和 linux 中,但该方法可用于任何具有某种跟踪路由和 ping 实用程序的操作系统。
#!/bin/bash
# Get the first non-local IP, that will be our ISP gateway
EXTERNAL_GW=`LANG=c traceroute 8.8.8.8 -n |grep -v -E '(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|8\.8\.8\.8)'|sed -n '1 s/ *[^ ]\+ \+\([^ ]*\) .*/\1/p'`
echo "External gateway: $EXTERNAL_GW"
echo -n "External IP : "
#Ping the gateway with the record source option. Also get the first non-local and not our EXTERNAL_GW
LANG=c ping -4 -R $EXTERNAL_GW -c 1|sed -n '/^RR:/,$p;/^$/q'|grep -v -E '(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|'$EXTERNAL_GW')'|head -n 1|cut -f 2
它只依赖于traceroute和ping(通常sed/grep/head/cut的Appart...)
首先,使用 traceroute 获取非内部范围网络上的第一台主机。这将是您的 NAT 主机之后的第一个公共网关。
然后我们使用记录源的选项 ping 该网关,同时提取所有本地网络范围。
生成的 IP 是您的 NAT 主机在公共网络上使用的 IP。
可以说它确实使用了外部资源。 (在本例中为 8.8.8.8),但任何 ICMP 返回公共主机都可以,并且总会有一些。
【讨论】:
【参考方案3】:使用Open.NAT:
var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
var ip = await device.GetExternalIPAsync();
这仅适用于 IPv4
【讨论】:
以上是关于无需调用外部服务器即可获取 Internet ip的主要内容,如果未能解决你的问题,请参考以下文章
无需使用互联网、wifi、APNS 和苹果推送通知服务器即可推送通知