2012-07-20 69 views
3

所以我一直在使用isReachable爲「平」的地址在我的Java代碼。這個代碼塊是每個人都似乎使用:isReachable總是返回true不管IP地址是什麼

try 
    { 
    InetAddress address = InetAddress.getByName("172.16.2.0"); 
    // Try to reach the specified address within the timeout 
    // periode. If during this periode the address cannot be 
    // reach then the method returns false. 
    boolean reachable = address.isReachable(10000); 
    System.out.println("Is host reachable? " + reachable); 
    } catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

我的問題是,不管我用我的IP地址,它總是返回true。即使我將其更改爲空字符串。任何想法爲什麼?

+0

你使用Java 1.5?一個錯誤報告已經打開:http://bugs.sun.com/view_bug.do?bug_id=5067312。現在已經解決了,所以如果您使用的是1.5版本,請嘗試使用更新的Java版本。 – 2012-07-21 10:09:53

回答

2

檢查是否一些地址可達的一種方法,通過java.net.InetAddress.isReachable()方法。 這些方法的實現本地化,並盡力「ping」InetAddress表示的地址。

令人驚訝的是Windows和在Linux/Unix實施java.net.InetAddress.isReachable()之間有許多不同之處。

的Windows,因爲它似乎奇怪,不正式支持ICMP的「ping」系統調用。因此,Java SE 5實現嘗試在端口7(echo服務)上打開一個TCP套接字並希望得到某種回覆。

的Linux/Unix,而是支持一個ICMP的 「ping」 系統調用。因此,java.net.InetAddress.isReachable()的實現首先嚐試執行「ping」系統調用;如果失敗,它會回退嘗試在端口7上打開TCP套接字,就像在Windows中一樣。

事實證明,在Linux/Unix中,ping系統調用需要root權限,所以大多數情況下java.net.InetAddress.isReachable()都會失敗,因爲許多Java程序不是以root身份運行的。

正確的做法是ICMP協議。這是ping在內部使用的。建議參見THIS收集知識並繼續。

FROM:Simone Bordet's Blog