2008-10-12 7 views
11

아래 조건에서 다음 JUnit 테스트를 통과하는 가장 빠르고 정확한 기능 boolean isReachable(String host, int port)을 사용하고 싶습니다. 타임 아웃 값은 JUnit 테스트 자체에 의해 지정되며 "도달 할 수없는"것으로 간주 될 수 있습니다.Java에서 도달 할 수없는 호스트를 감지하는 가장 빠른 방법은 무엇입니까?

참고 : 모든 대답은 플랫폼 독립적이어야합니다. 즉, 은 포트 7 (Windows의 문서화되지 않은 기능인 ICMP 핑)에 의존하기 때문에 작동하지 않습니다.이 포트는이 설정에서 차단됩니다.

LAN 설정 :

  • thisMachine (192.168.0.100)
  • otherMachine (192.168.0.200) 더 기계가 noMachine라고하거나
  • 두 시스템이 실행 (항상 도달 할 수없는)을 IP 192.168.0.222을 가지고 있습니다
  • Apache Tomcat의 포트 8080; 다른 모든 포트는
  • example.com (208.77.188.166는) 포트 80에 웹 서버를 실행하고 LAN이

때때로 인터넷에 연결되어있는 경우에만 연결할 수 있습니다 (포트 7 포함)에 연결할 수는 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. 
} 

다음 테스트는 실행됩니다. 랜이 인터넷에를 연결 한 경우

@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. 
} 

다음 테스트는 실행됩니다.

@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. 
} 

답변

0

내 가장 최근의 솔루션은 연결을 수행하는 동안 3000ms가 타임 아웃으로 TimedSocket (source code)를 사용하여 따라 달라집니다.

타이밍 :

  • 1406ms : testLocalHost()
  • 5280ms : testLAN()

도이 제대로 동작하지 않습니다 :

  • testNoDNS()
  • testHaveDNS()
0

실용적인 방법이 확실하지 않습니다.

traceroute (windows tracert)에 해당하는 작업을 수행하고 성공하면 어떻게 할 수 있습니까?

기업 네트워크에서 ICMP (ping)가 관리자에 의해 차단 된 것을 보았지만 일반적으로 tracert는 여전히 작동합니다. tracert가하는 일을 빠르게 수행 할 수 있다면 트릭을해야할까요?

행운을 빈다.

1

당신은 당신이 또한 호스트 이름과 포트 번호를 기반으로 URL을 만들 수있는 웹 서버에 연결할 수 있는지 여부를 테스트하고 URLConnectionconnect method의 (예외 포함) 결과를 확인 만들 것을 사용하려면해야 웹 서버에 연결할 수 있는지 여부를 알려줍니다.

5

먼저 이 잠재적으로 개의 충돌 요구 사항임을 인식해야합니다. IP 소켓은 시간 결정적이지 않습니다. 도달 할 수없는 것을 가장 빨리 감지 할 수있는 것은 경과 된 시간 초과입니다. 도달 가능성을 더 빨리 감지 할 수 있습니다. 도달 가능성을 가정

는 /의 isReachable은 당신의 진짜 목적은, 당신은 Java Ping 시뮬레이터와 같이 그냥 예는 시간 서비스에 연결하는 간단한 비 블로킹 소켓 IO를 사용해야하지만, 8080

0

잘 동등하게 일 것입니다 매우 짧은 기간에 많은 수의 호스트에서이 작업을 수행해야하는 경우 fping과 같은 도구를 사용하는 것이 좋습니다. 쉘을 실행하여 출력하고 다시 출력 할 때 출력을 구문 분석합니다. fping은 많은 수의 병렬 쿼리를 한 번에 실행하므로 이론적으로 수천 개의 호스트를 1 분 내에 확인할 수 있습니다 (제한은 4096이라고 생각하십니까?)

0

호스트 가용성에 대한 속도 결정 단계가 사용자 코드에 포함되어 있지 않습니다. 그러나 넷 래그에서. 호스트가 응답하기를 기다려야하며, 시간이 걸릴 수 있습니다. 응답을 기다리는 동안 프로그램이 차단되면 문제가 될 수 있습니다. 각 호스트를 객체로 생성하여 가용성을 확인하기위한 고유 한 스레드 메소드가있는 각각의 호스트를 작성했습니다. 내 자신의 상황에서 나는 추적 할 40 명의 주인이있다. 내 메인 프로그램은 매 20 초마다 한 번에 40 개의 머신 객체를 반복하며 각 메소드에 적절한 메소드를 호출하여 가용성을 확인합니다. 각 기계 객체가이를 수행하기 위해 자체 스레드를 생성하기 때문에 40 대의 모든 기계가 동시에 조사되고 각각에 대한 응답 시간 (최대 500ms)은 문제가되지 않습니다.

관련 문제