2017-09-07 1 views
1

InetAddress 클래스의 isReachable 메서드로 이상한 동작이 나타납니다.InetAddress isReachable 메서드에 최소 시간 제한이 있습니까?

Method prototype은 다음과 같습니다 대상 IP는 물론 도달 할 수없는 경우

public boolean isReachable(int timeout) 
  • 타임 아웃> 1500 (MS)를 사용하여는 방법은 (인수로 주어진 정확한 시간 을 기다립니다 ..).
  • 시간 제한 < 1500를 사용하는 방법은이 코드는 매우 간단합니다 1000MS 최대 ...

을 기다립니다 :

InetAddress addr = null; 
    String ip = "10.48.2.169"; 

    try { 
     addr = InetAddress.getByName(ip); 
    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    Timestamp s = new Timestamp(System.currentTimeMillis()); 
    System.out.println(s + "\t Starting tests :"); 

    pingTest(addr, 100); 
    pingTest(addr, 500); 
    pingTest(addr, 1000); 
    pingTest(addr, 1500); 
    pingTest(addr, 2000); 
    pingTest(addr, 2500); 
pingTest에 의해 정의된다

:

public static void pingTest(InetAddress addr, int timeout) { 
     boolean result = false; 
     try { 
      result = addr.isReachable(timeout); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Timestamp s = new Timestamp(System.currentTimeMillis()); 
     System.out.println(s + "\t (" + timeout + ") " + addr.toString() + " " + result); 
    } 

그러면 출력은

입니다.
2017-09-07 16:45:41.573 Starting tests : 
2017-09-07 16:45:42.542 (100) /10.48.2.169 false 
2017-09-07 16:45:43.542 (500) /10.48.2.169 false 
2017-09-07 16:45:44.541 (1000) /10.48.2.169 false 
2017-09-07 16:45:46.041 (1500) /10.48.2.169 false 
2017-09-07 16:45:48.041 (2000) /10.48.2.169 false 
2017-09-07 16:45:50.541 (2500) /10.48.2.169 false 

그래서 질문 : InetAddress isReachable 메서드에 최소 시간 제한이 있습니까?이 충분히 명확하지 않은 경우

이 말해 ...

아니면 그냥 난 아직도 그리워 큰 실수를 (... 내가 큰 시간 제한을 의심하지만, 내 의심의 여지 1500 등) .

도움과 의견을 보내 주셔서 감사합니다.

+0

사용자가 문서화되지 않은 최소 시간 초과 ("최소"검색)를보고하는이 OpenJDK [버그 리포트] (https://bugs.openjdk.java.net/browse/JDK-8143397)를보십시오. 이 보고서는 확정적인 것은 아니지만 귀하의 경험을 뒷받침하는 데 도움이 될 수 있습니다. – MarsAtomic

답변

3

먼저 Java에서 지원하는 각 플랫폼에서 INetAddress.isReachable의 동작이 동일하지 않다는 것을 알아야합니다. Windows에서 작업하는 것으로 가정합니다.

문서화되지 않은 동작이 발생하면 항상 원본을 볼 수 있어야합니다. Windows 용 java.net 구현은 OpenJDK의 경우 here입니다 (Oracle JVM과 매우 유사해야하지만이 사실은 확실하지 않습니다). 우리가 isReachable 메소드 구현에서 본 어떤

입니다 :

  1. 그들이 NET_Wait 기능
  2. 에 시간 제한 값을 전달 너무 신뢰할 수없는 윈도우 ICMP 프로토콜의 구현을 찾을 수 있기 때문에 그들이 핑에 의존하지 않는

그래서 의 isReachable 방법은 핑을 수행하지 않습니다 우리는 NET_Wait가 해제 시간 종료와 함께 무엇을 확인해야 1 초 미만의 타임 아웃이 불가능한 이유를 설명합니다.

NET_Wait 기능이 정의된다 : src/windows/native/java/net/net_util_md.c

그것은 이러한 이벤트가 select 함수 호출시 발생하면 휴식 무한 루프로 구성 : 소켓의 파일 기술자에

  • NET_WAIT_CONNECT (소켓 연결 원격 호스트에)
  • 제한 시간 종료

select 기능은 설명서 페이지에 문서화되어 있으며 here과 상담 할 수 있습니다. 이 맨 페이지는 타임 아웃이 "시스템 클록 세분화로 반올림 될 수 있으며 커널 스케줄링 지연은 블로킹 간격이 소량으로 초과 될 수 있음을 의미합니다"라고 알려줍니다.

최소 시간 제한 값에 대한 보장이없는 이유는이 때문입니다. 또한 JVM에서 지원하는 OS에 따라 구현이 다르기 때문에 설명서에 최소 시간 제한 값이 없다고 생각합니다.

희망 사항을 이해하면 도움이됩니다.

그러나 원하는 시간 제한을 달성하려면 별도의 작업으로 도달 가능성을 테스트 할 수 있습니다. 태스크가 결과를 리턴 할 때까지 기다리거나 제한 시간 이상 기다리면 태스크를 취소하거나 결과를 무시합니다.