0

我为 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 上的终端以连接到我的应用程序的地址。

4

1 回答 1

3

在这种情况下,您的 Galaxy Tab 10.1 会收到一个 IPv6 地址fe80::be47:60ff:feff:21e2。这可能是由于您的 HTC Desire 和 Galaxy Tab 关于 IPv6 的不同偏好或功能造成的。

这并没有错,当 IPv4 地址空间用完时,越来越多的设备将(必须)使用 IPv6 地址。

正如Nesim在他对该问题的评论中指出的那样,IPv6 地址以链路本地地址开头fe80:如果设备没有连接到任何分发地址的网络(例如通过 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 个地址,上面的代码将返回——选择第一个似乎过于乐观。

于 2012-04-23T19:23:29.733 回答