Ошибка при проверке IP-адреса

#android

#Android

Вопрос:

Я с помощью приведенного ниже условия проверяю, доступен ли IP-адрес или нет

 if ( InetAddress.getByName(server1IPAddress).isReachable(1000) == false) 
{         
  ...... 
  ......
}
  

Он корректно работает с обычным IP-адресом 192.168.1.158
но когда я указываю номер порта вместе с внешним IP 61.17.172.4: 85, отображается ошибка UnknownHostException .

Кто-нибудь поможет мне, пожалуйста

Комментарии:

1. Что произойдет, если вы удалите номер порта и просто передадите ip-адрес? похоже на 61.17.172.4..

2. Использовать inetsocket address sockaddr = новый inetsocket address (IP-адрес, портНо);

Ответ №1:

Просто мысль, я не слишком знаком с Inetaddress. Попробуйте использовать запятую, например InetAddress (строка ip, строка pt). Взгляните сюда:http://nmstl.sourceforge.net/doc/apiuc/classInetAddress.html#a2

Надеюсь, это поможет

Комментарии:

1. На самом деле я не могу разделить IP-адрес и порт, который поступил из внешнего источника

Ответ №2:

Я думаю, что это работает правильно. Порты, обозначенные таким образом, верны для таких протоколов, как http и в URL-адресах, но не для адресов хостов. Я думаю, вам нужно удалить часть порта, чтобы вызвать getByName.

Если у вас есть полный URL, подобныйhttp://host.com:85/foo/bar.html для получения адреса хоста можно использовать что-то вроде следующего:

 public static String extractAddressFromUrl(String url) {
        String urlToProcess = null;

        //find protocol
        int protocolEndIndex = url.indexOf("://");
        if(protocolEndIndex>0) {
            urlToProcess = url.substring(protocolEndIndex   3);
        } else {
            urlToProcess = url;
        }

        // If we have port number in the address we strip everything
        // after the port number
        int pos = urlToProcess.indexOf(':');
        if (pos >= 0) {
            urlToProcess = urlToProcess.substring(0, pos);
        }

        // If we have resource location in the address then we strip
        // everything after the '/'
        pos = urlToProcess.indexOf('/');
        if (pos >= 0) {
            urlToProcess = urlToProcess.substring(0, pos);
        }

        // If we have ? in the address then we strip
        // everything after the '?'
        pos = urlToProcess.indexOf('?');
        if (pos >= 0) {
            urlToProcess = urlToProcess.substring(0, pos);
        }
        return urlToProcess;
    }
  

Кроме того, если вы пытаетесь выяснить, доступен ли хост, вы могли бы рассмотреть возможность использования ConnectivityManager.requestRouteToHost()

Ответ №3:

Разве вы не можете использовать метод, предложенный mmeyer, чтобы разделить входную строку на IP и порт, а затем использовать новый метод InetAddress? Непроверенный пример…

 String urlToProcess = null; /* your input string */

int pos = urlToProcess.indexOf(':'); /* find the : */
if (pos >= 0) {
   ipAddress = urlToProcess.substring(0,pos ); /* return ip without the port */
   portNo = urlToProcess.substring(pos   1); /* return the port */
}

sockaddr = new InetSocketAddress(ipAddress, portNo);

if ( InetAddress.getByName(sockaddr).isReachable(1000) == false) {
...your code....
}
  

Как я уже сказал, я не эксперт и не проверял код, так что отнеситесь к этому с недоверием. Это просто комбинация ответов всех.