无需调用外部服务器即可获取互联网 IP



我正在开发一个需要获取互联网IP的安卓应用程序。是否可以在不调用外部服务器的情况下获得互联网 IP?

如果可能,如何在不发出额外网络请求的情况下获取互联网 IP?

如果不向外部服务器发出请求,您可能无法获取您的公共 IP 地址,因为您的设备在 LAN 内,它不关心路由器到互联网的公共 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

老问题,但在其他地方找不到任何合理的答案之后......

仅使用本地资源获取公共 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

它仅取决于跟踪路由和ping(通常的sed/grep/head/cut的Appart...

  • 首先,使用跟踪路由获取非内部范围网络上的第一个主机。这将是继 NAT 主机之后的第一个公共网关。

  • 然后,我们使用记录源的选项对该网关进行ping,并提取所有本地网络范围。

  • 生成的 IP 是 NAT 主机在公共网络上使用的 IP。

可以说它确实使用了外部资源。(在本例中为 8.8.8.8(但是任何返回公共主机的 ICMP 都可以,并且总会有一些。

使用 Open.NAT:

var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
var ip = await device.GetExternalIPAsync();

这仅适用于IPv4

最新更新