boolean isReachable(String host, int port)
以下の条件で以下のJUnitテストに合格する最速かつ最も正確な関数が欲しいです。タイムアウト値はJUnitテスト自体によって指定され、「到達不能」と見なされる場合があります。
注意:すべての回答はプラットフォームに依存しない必要があります。これは、 Windowsでpingを実行するためInetAddress.isReachable(int timeout)
にポートに依存しているため7
(ICMP pingはWindowsでは文書化されていない機能です)、このセットアップではこのポートがブロックされているため、機能しないことを意味します。
LANセットアップ:
thisMachine
(192.168.0.100
)otherMachine
(192.168.0.200
)- マシンが呼び出され
noMachine
ていないか、IPがありません192.168.0.222
(常に到達不能) - 両方のマシンがポートでApacheTomcatを実行しています
8080
。他のすべてのポートに到達できません(ポートを含む7
) example.com
(208.77.188.166
)はポートでWebサーバーを実行しており80
、LANがインターネットに接続されている場合にのみ到達可能です
場合によっては、LANがインターネットから切断されます。その場合、IPアドレスで呼び出されたローカルマシンのみが到達可能です(他のすべてのマシンは到達不能です。DNSはありません)。
すべてのテストはで実行されthisMachine
ます。
@Test(timeout=1600) // ~320ms per call (should be possible to do better)
public void testLocalhost() {
// We can always reach ourselves.
assertTrue(isReachable("localhost", 8080));
assertTrue(isReachable("127.0.0.1", 8080));
assertTrue(isReachable("thisMachine", 8080)); // Even if there's no DNS!
assertTrue(isReachable("192.168.0.100", 8080));
assertFalse(isReachable("localhost", 80)); // Nothing on that port.
}
@Test(timeout=5500) // ~1867ms per call (should be able to do better)
public void testLAN() {
assertTrue(isReachable("192.168.0.200", 8080)); // Always connected to the LAN.
assertFalse(isReachable("192.168.0.222", 8080)); // No such a machine.
assertFalse(isReachable("noMachine", 8080)); // No such machine.
}
次のテストは、LANがインターネットから切断されている場合にのみ実行されます。
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testNoDNS() {
assertFalse(isReachable("otherMachine", 8080)); // No DNS.
assertFalse(isReachable("example.com", 80)); // No DNS & no Internet.
assertFalse(isReachable("208.77.188.166", 80)); // No Internet.
}
次のテストは、LANがインターネットに接続されている場合にのみ実行されます。
@Test(timeout=5600) // ~1867ms per call (reasonable?)
public void testHaveDNS() {
assertTrue(isReachable("otherMachine", 8080)); // DNS resolves local names.
assertTrue(isReachable("example.com", 80)); // DNS available.
assertTrue(isReachable("208.77.188.166", 80)); // Internet available.
}