2014-11-07 3 views
2

В моем приложении я использую InetAddress.getByName() для преобразования строк типа 192.168.1.56 в объекты InetAddress - в основном потому, для хранения IP-адресов как IP-адресов, а не как строк. До сих пор, я бы поклялся, что это тоже неплохо, но сегодня я обнаружил ошибку. Это не работает:Случайная ошибка Использование InetAddress.getByName()

InetAddress ia = InetAddress.getByName ("192.168.1.056"); 

Казалось бы, что мой Android думает, что строка является именем хоста, и поэтому он пытается найти его (что не возможно, потому что это не на «реальные» сети). Это то, что я могу обойти - значит есть ли способ настаивать на getByName, что это IP-адрес, а не имя хоста? Или мне нужно построить метод для очистки ведущих нулей из строк IP-адресов? Или есть утилита Apache, где-то похоронили, что может улучшить работу?

+0

Какая ошибка вы получаете? Кроме того, некоторые реализации будут обрабатывать ведущие нули как восьмеричные значения, которые не будут такими, какие вы хотите. Не уверен в этом. – FatalError

+0

Проверьте этот вопрос и ответы: http://stackoverflow.com/questions/9556978/how-come-inetaddress-getbyname1-2-is-valid-ip-address –

+0

Ошибка, которую я получаю, это NetworkOnMainThread - что ведет меня полагая, что программное обеспечение обрабатывает строку как имя хоста и выходит из сети, пытаясь ее разрешить, что невозможно и не может сделать. Извините за неполную почту. – Rich

ответ

0

Может быть, мастер Regex мог найти способ исправить строку IP-адреса напрямую, но я не знаю, как это сделать. Однако есть нечто, называемое библиотекой Apache SubnetUtils, которая является родной для Android. SubnetUtils не имеет коровы по строке IP-адреса с нулевым значением в ней. Мой код выглядит следующим образом:

public static InetAddress addrFromStr (String addr) 
{ 
    InetAddress ia = null; 
    SubnetUtils su = new SubnetUtils (addr + "/8"); 

    try 
    { 
     ia = InetAddress.getByName (su.getInfo().getAddress()); 
    } 
    catch (UnknownHostException e) 
    { } 

    return ia; 
} 

В основном, я создаю SubnetUtils объект, а затем попросить его на IP-адрес - который теперь лишен любой числовой странности, что InetAddress.getByName(), по-видимому, не может справиться. (Бизнес «/ 8» - это маска подсети обозначений CIDR, и единственное, что я могу сказать об этом, - не использовать «/ 0»).

0

Почему бы не попробовать getByAddress (byte[] ipAddress)? Этот метод кажется более подходящим для ваших нужд.

+0

Я использую свой код для анализа строки IP-адреса, предоставленной пользователем в диалоговом окне EditText. По-видимому, один из моих пользователей нашел новый и интересный способ повредить вещи. Я пытаюсь поймать ошибку, не прибегая к поджариванию Ошибочной ошибки адреса и ничего не делая. – Rich

Смежные вопросы