我已经为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上的终端以连接到我的应用程序。
答案 0 :(得分:3)
您的Galaxy Tab 10.1会收到一个IPv6地址,在本例中为fe80::be47:60ff:feff:21e2
。这可能是由于HTC Desire和Galaxy Tab对IPv6的不同偏好或功能造成的。
没有任何问题,当IPv4地址空间用完时,越来越多的设备将(必须)使用IPv6地址。
正如Nesim在对该问题的评论中指出的那样,从fe80:
开始的IPv6地址是link-local addresses,即设备在没有连接的情况下自行分配的地址范围任何分发地址的网络,例如通过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个是环回地址(localhost),4个链接本地地址 - 留下了4个地址,以上代码将返回 - 选择第一个似乎过于乐观。