Случайная ошибка при использовании InetAddress.getByName()

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

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

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


person Rich    schedule 07.11.2014    source источник
comment
Какую ошибку вы получаете? Кроме того, некоторые реализации будут обрабатывать ведущие нули как восьмеричное значение, а это не то, что вам нужно. Не уверен насчет этого.   -  person FatalError    schedule 07.11.2014
comment
Проверьте этот вопрос и ответы: stackoverflow.com/questions/9556978/   -  person Anas Alkhatib    schedule 07.11.2014
comment
Ошибка, которую я получаю, называется NetworkOnMainThread, что наводит меня на мысль, что программное обеспечение обрабатывает строку как имя хоста и выходит в сеть, чтобы попытаться разрешить ее, что одновременно невозможно и неправильно. Извините за неполный пост.   -  person Rich    schedule 07.11.2014
comment
Анас: Да, но, похоже, это не имеет отношения к данному вопросу. Моя адресная строка содержит 4 числа и отдельно проверяется на фактический BE и IP-адрес (с использованием java.util.regex.Pattern).   -  person Rich    schedule 07.11.2014
comment
Можете ли вы опубликовать трассировку стека?   -  person Sotirios Delimanolis    schedule 07.11.2014


Ответы (2)



Возможно, мастер регулярных выражений мог бы найти способ исправить строку 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»).

person Rich    schedule 10.11.2014