首頁 > Java > java教程 > 為什麼 Ping 成功但「InetAddress.isReachable()」回傳 False?

為什麼 Ping 成功但「InetAddress.isReachable()」回傳 False?

Mary-Kate Olsen
發布: 2024-12-07 01:58:12
原創
1002 人瀏覽過

Why Does `InetAddress.isReachable()` Return False Even Though Ping Succeeds?

儘管Ping 成功,為什麼inetAddress.isReachable() 傳回False

您的程式碼會擷取特定IP 位址的InetAddress 實例,然後呼叫其isReachable() 方法,超時時間為1000毫秒:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
登入後複製

然而,令人驚訝的是,即使您可以成功 ping 通 IP 位址,isReachable() 也會傳回 false。

原因與解決方案

原因:

isReachable() 不依賴於ping 指令或任何其他特定操作系統的工具。相反,它使用 ICMP 協定透過發送 ICMP Echo Request 訊息並等待 ICMP Echo Reply 訊息來檢查主機是否可達。某些系統可能會阻止 ICMP 流量,導致 isReachable() 方法失敗。

解:

要在不依賴isReachable() 的情況下確定可及性,可以使用以下Java 程式碼:

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;
    }
}
登入後複製

此方法嘗試連接到遠端電腦上指定的開放連接埠。如果連線成功,則表示主機可達。開放端口可以是通常可訪問的任何端口,例如 SSH 的 22、HTTP 的 80 或 HTTPS 的 443。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板