0

HTC Desire用のアプリを作成しました。アプリは、デバイスの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)

これは、アプリに接続するためにPCの端末に渡すものであるため、IPアドレスである必要があります。

4

1 に答える 1

3

この場合、GalaxyTab10.1はIPv6アドレスを受け取りますfe80::be47:60ff:feff:21e2。これは、IPv6に関するHTCDesireとGalaxyTabの設定または機能が異なることが原因である可能性があります。

それには何の問題もありません。IPv4アドレス空間がなくなると、ますます多くのデバイスがIPv6アドレスを使用するようになります。

Nesimが質問に対するコメントで指摘しているように、で始まるIPv6アドレスはfe80:リンクローカルアドレスです。つまり、DHCPを介してアドレスを渡すネットワークに接続できない場合、デバイスが自己割り当てするアドレスの範囲です。

そのため、Galaxy TabがWi-Fiネットワークに接続されていないか、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システムには、合計10個のアドレスを持つ23個のネットワークインターフェイス(ほとんどが仮想)がリストされています。そのうち2個はループバックアドレス(localhost)、4個はリンクローカルアドレスです。これにより、上記のコードの4つのアドレスが残ります。 return-最初のものを選ぶことは過度に楽観的であるように思われます。

于 2012-04-23T19:23:29.733 に答える