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 중국어 웹사이트의 기타 관련 기사를 참조하세요!