> 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 인스턴스를 검색한 다음 해당 인스턴스를 호출합니다. 시간 제한이 1000인 isReachable() 메서드 밀리초:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
로그인 후 복사

그러나 놀랍게도 isReachable()은 IP 주소를 성공적으로 ping할 수 있음에도 불구하고 false를 반환합니다.

원인 및 해결책

원인:

isReachable()은 ping 명령이나 기타 운영 체제별 도구에 의존하지 않습니다. 대신 ICMP 프로토콜을 사용하여 ICMP 에코 요청 메시지를 보내고 ICMP 에코 응답 메시지를 기다려 호스트에 연결할 수 있는지 확인합니다. 일부 시스템에서는 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으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿