Home >Java >javaTutorial >Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-27 19:13:11901browse

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

Investigating False Reachability from InetAddress.isReachable()

InetAddress, a Java class for working with IP addresses, provides methods for various network-related tasks. One such method is isReachable(), used to determine if a host is accessible via a network. However, in some cases, this method might return false even when pinging the IP address succeeds.

Consider the following code snippet that attempts to check the reachability of a host:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));

If you run this code, you might encounter a situation where isReachable() returns false, despite the fact that you can ping the specified IP address.

To address this issue, an alternative approach is presented, which remains platform-independent and leverages information about open ports on the remote machine.

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

By utilizing this code, you can determine the reachability of a host by attempting to establish a connection to a known open port on that host.

Update:

For a more concise version of the code snippet, refer to the following:

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

By employing this approach, you can reliably determine the reachability of a host, even in scenarios where InetAddress.isReachable() does not provide an accurate indication.

The above is the detailed content of Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn