首頁 >Java >java教程 >為什麼 Ping 成功時 `InetAddress.isReachable()` 有時會回傳 False?

為什麼 Ping 成功時 `InetAddress.isReachable()` 有時會回傳 False?

Susan Sarandon
Susan Sarandon原創
2024-12-25 03:53:12350瀏覽

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

儘管Ping 可訪問,InetAddress.isReachable() 返回False

在Java 中,InetAddress.isReachable() 用於檢查給定的IP 是否位址可以從目前機器存取。令人驚訝的是,即使您可以成功 ping IP 位址,您也可能會遇到此方法傳回 false 的情況。

出現這種不一致的原因是 InetAddress.isReachable() 不使用與 ping 相同的機制。相反,它採用底層平台的互聯網控制訊息協定 (ICMP) 實現,這可能與 ping 命令不同。

平台獨立解決方案

解決為了解決這種差異並獲得平台獨立性,請考慮以下方法:

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

此解決方案檢查透過嘗試使用TCP 協定連接到開放連接埠(例如,用於SSH 的連接埠22、用於Web 伺服器的連接埠80 或443等)來取得指定的 IP 位址。如果連線成功,則認為IP位址可達;

簡潔版本

為簡潔起見,您可以將程式碼壓縮如下:

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

此平台無關方法提供了一種可靠的方法來確定IP 位址的可及性,而不管底層ICMP 如何實施。

以上是為什麼 Ping 成功時 `InetAddress.isReachable()` 有時會回傳 False?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn