我为HTC的愿望编写了一个应用程序,它获取了设备的IP地址并将其打印到屏幕上。当我将此应用程序安装到我的选项卡 10.1 时,IP 地址以奇怪的格式以字母和数字出现?
private 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()) { return inetAddress.getHostAddress().toString(); }
}
}
}
catch(SocketException ex)
{
Log.e(TAG , ex.toString());
}
return null;
}
选项卡 10.1 有什么不同?
(返回的 IP - fe80::be47:60ff:feff:21e2)
需要是一个 IP 地址,因为这是我传递给 PC 上的终端以连接到我的应用程序的地址。
>您的Galaxy Tab 10.1接收IPv6地址,在本例中为fe80::be47:60ff:feff:21e2
。这可能是由HTC Desire和Galaxy Tab关于IPv6的不同偏好或功能引起的。
这并没有错,当IPv4地址空间用完时,越来越多的设备将(必须)使用IPv6地址。
正如Nesim在对该问题的评论中指出的那样,以fe80:
开头的IPv6地址是链路本地地址,即设备在没有连接到任何分发地址的网络时自行分配的地址范围,例如通过DHCP。
因此,您的Galaxy Tab似乎没有连接到任何wifi网络,或者没有通过DHCP接收任何地址。
问题中的代码片段返回它找到的第一个地址,并且不会过滤掉链接本地地址(这些地址对于从外部连接没有用)。以下代码为您提供了既不是环回也不是链接本地的所有地址。你如何在其中许多之间进行选择取决于你 - 老实说我不知道:
private static List<InetAddress> getIpAddress() {
try {
List<InetAddress> result = new ArrayList<InetAddress>();
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface intf = interfaces.nextElement();
Enumeration<InetAddress> addresses = intf.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress address = addresses.nextElement();
if (!address.isLoopbackAddress() && !address.isLinkLocalAddress()) {
result.add(address);
}
}
}
return result;
} catch (SocketException ex) {
Log.e(TAG, "Failed to list network interfaces.", ex);
return null;
}
}
为了进行比较,我的Windows系统列出了23个网络接口(其中大多数是虚拟的),总共有10个地址,其中2个是环回地址(本地主机),4个链路本地地址 - 留下上述代码将返回的4个地址 - 选择第一个似乎过于乐观。