Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android InetAddress.getByName(ip).isReachable(timeout) always returns false [duplicate]

Tags:

java

android

I am trying to figure out how to tell if a particular ipaddress is available in my android app during debugging ( I haven't tried this on an actual device ).

From reading it appears that InetAddress.isReachable should do this for me.

Initially I thought that I could code something like:

InetAddress address = InetAddress.getByAddress( new byte[] { (byte) 192, (byte) 168, (byte) 254, (byte) 10 ); success = address.isReachable( 3000 );

This returns false even though I am reasonably sure it is a reachable address.

I found that if I changed this to 127, 0, 0, 1 it returned success.

My next attempt was same code, but I used the address I got from a ping of www.google.com ( 72.167.164.64 as of this writing ). No success.

So then I tried a further example:

int timeout = 2000;
InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
for (InetAddress address : addresses)
{
    if ( address.isReachable(timeout))
    {
       success = true; // just set a break point here
    }
}

I am relatively new to Java and Android so I suspect I am missing something, but I can't find anything that would indicate what that is.

like image 264
badMonkey Avatar asked Nov 23 '22 23:11

badMonkey


1 Answers

seems that isReachable() never worked well on Android b/c it tries to use ICMP, that usually needs a root privileges, and then it tries to establish connection to port 7, that's usually have no running services on modern systems.

you'd better check connectivity with establishing TCP connection to ports you know should be open.

like image 103
zed_0xff Avatar answered Nov 26 '22 22:11

zed_0xff