Нахождение IP-адреса Galaxy Tab 10.1 для приложения
Я написал приложение для 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)
Должен быть IP-адресом, поскольку это то, что я передаю терминалу на ПК для подключения к своему приложению.
1 ответ
Ваша Galaxy Tab 10.1 получает IPv6-адрес, в этом случае fe80::be47:60ff:feff:21e2
, Это может быть вызвано различными предпочтениями или возможностями вашего HTC Desire и Galaxy Tab относительно IPv6.
В этом нет ничего плохого, все больше и больше устройств будут (должны) использовать адреса IPv6, когда закончится адресное пространство IPv4.
Как отмечает Nesim Razon в своем комментарии к вопросу, адреса 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 перечисляет 23 сетевых интерфейса (большинство из них виртуальные) с общим количеством адресов 10, 2 из которых являются адресами обратной связи (localhost), 4 адресами локальной ссылки - это оставляет 4 адреса, которые приведенный выше код будет возврат - выбор первого кажется чрезмерно оптимистичным.