Home > Java > javaTutorial > body text

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

Patricia Arquette
Release: 2024-11-27 19:13:11
Original
793 people have browsed it

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));
Copy after login

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;
    }
}
Copy after login

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;
    }
}
Copy after login

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!

source:php.cn
Statement of this Website
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
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template