Home >Java >javaTutorial >Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?

Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?

Susan Sarandon
Susan SarandonOriginal
2024-12-25 03:53:12350browse

Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?

InetAddress.isReachable() Returning False Despite Ping Accessibility

In Java, InetAddress.isReachable() is used to check if a given IP address is reachable from the current machine. Surprisingly, you may encounter a scenario where this method returns false even though you can successfully ping the IP address.

This inconsistency arises because InetAddress.isReachable() does not use the same mechanism as ping. Instead, it employs the underlying platform's implementation of the Internet Control Message Protocol (ICMP), which may differ from the ping command.

Platform-Independent Solution

To address this discrepancy and gain platform independence, consider the following approach:

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;
    }
}

This solution checks the reachability of the specified IP address by attempting to connect to an open port (e.g., port 22 for SSH, port 80 or 443 for web servers, etc.) using the TCP protocol. If the connection succeeds, the IP address is deemed reachable; otherwise, it indicates unreachability.

Succinct Version

For brevity, you can condense the code as follows:

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;
    }
}

This platform-independent approach provides a reliable way to ascertain the reachability of an IP address regardless of the underlying ICMP implementation.

The above is the detailed content of Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?. 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