2010-05-05 32 views
5

Tôi đang sử dụng Clojure, nhưng tôi có thể đọc Java, vì vậy đây không phải là câu hỏi cụ thể của Clojure. Điều này thậm chí không có vẻ là làm việc từ Java.isReachable in Java có vẻ như không hoạt động theo cách nó được cho là

Tôi đang cố gắng triển khai một chút chức năng 'ping' bằng cách sử dụng isReachable. Mã Tôi đang sử dụng là:

(.isReachable (java.net.InetAddress/getByName "www.microsoft.com") 5000) 

dịch Java bởi một người bạn tốt của tôi:

public class NetTest { 
    public static void main (String[] args) throws Exception{ 
    String host = "acidrayne.net"; 
    InetAddress a = InetAddress.getByName(host); 

    System.out.println(a.isReachable(10000)); 
    } 
} 

Cả hai trả về false. Tôi cho rằng tôi phải làm điều đó sai, nhưng nghiên cứu của Google lại cho tôi biết khác đi. Tôi bối rối!

+0

Bạn có thể ping axitrayne.net từ máy bạn đang chạy tính năng này không? – Yishai

+0

Tôi có thể ping axitrayne.net qua 'ping -c 1 axitrayne.net', nhưng không phải thông qua mã được đăng ở trên. Và đó là trên bất kỳ máy nào. – Rayne

Trả lời

3

cập nhật để đáp ứng với nhận xét rằng đây là sai:

Sử dụng Unix/Linux ??

http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html nói:

Linux/Unix, thay vào đó, hỗ trợ một ICMP "ping" gọi hệ thống. Vì vậy, việc thực hiện java.net.InetAddress.isReachable() trước tiên sẽ thực hiện lệnh gọi "ping" **; nếu điều này không thành công, nó rơi trở lại cố gắng để mở một cổng TCP trên [sic - to] cổng 7, như trong Windows.

Nó chỉ ra rằng trong Linux/Unix hệ thống gọi ping đòi hỏi quyền root, vì vậy hầu hết các lần java.net.InetAddress.isReachable() sẽ thất bại, bởi vì nhiều chương trình Java không chạy bằng root , và bởi vì địa chỉ đích không có dịch vụ echo và chạy. Quá tệ.

Các bình luận dưới đây từ @EJP cho thấy một phần của về dịch vụ echo là sai, sai sai:

Đó không phải là chính xác. isReachable trả về true nếu nó nhận được một ConnectException đang cố gắng kết nối với cổng 7, vì điều đó chứng minh rằng máy chủ lưu trữ và có thể gửi các phân đoạn RST.

Trong trường hợp như vậy, tôi sử dụng gói sniffer như WireShark, tcpdump (WinDump trên Windows) hoặc snoop (Solaris) để xác nhận điều thực sự xảy ra trên dây.

+0

Điều đó khá khủng khiếp. – Rayne

+0

@Rayne - Đồng ý –

+2

Điều đó không đúng. isReachable trả về true nếu nó nhận được một ConnectException đang cố gắng kết nối với cổng 7, vì điều đó chứng minh rằng máy chủ lưu trữ và có thể gửi các phân đoạn RST. – EJP

1

Câu trả lời đúng không thực sự đúng. Microsoft.com chỉ đơn giản là bỏ qua các yêu cầu ICMP, có lẽ để tránh các cuộc tấn công ping cơ bản. Đối với các máy chủ thứ hai tôi không có ý tưởng những gì các vấn đề với ping có thể được, nhưng tôi đang sử dụng GNU/Linux và isReachable hoạt động tốt.

+0

Nó hoạt động tốt nếu tôi chạy nó như là người chủ, và một người bạn kinh nghiệm cùng một điều chính xác, vì vậy tôi khá chắc chắn rằng câu trả lời của ông là ít nhất là chính xác đến thời điểm đó. – Rayne

+0

Có thể như vậy. Tôi không phải chuyên gia, tôi chỉ nói rằng chạy mã bằng cách sử dụng isReachable() trong khi không root trong Linux đã làm việc cho một số máy chủ ... –

Các vấn đề liên quan