2011-01-24 26 views
6

Như một bài tập tôi phải tìm tất cả các máy tính còn sống trên mạng LAN. Tôi đang sử dụng chức năng isReachable của lớp InetAddress. Nhưng vấn đề là không có gì được hiển thị có thể truy cập với tôi. Vì vậy, tôi đã cố gắng để có isReachable với IP của Google nhưng vẫn không thể truy cập được.Vấn đề với isReachable trong lớp InetAddress

Đây là mã:

import java.net.*; 

public class alive{ 
    public static void main(String args[]){ 
     try{ 
      InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104}); 
      boolean b = ia.isReachable(10000); 
      if(b){ 
       System.out.println("Reachable"); 
      } 
      else{ 
       System.out.println("Unrachable"); 
      } 

     }catch(Exception e){ 
      System.out.println("Exception: " + e.getMessage()); 
     } 
    } 
} 

Output là: Unreachable

+0

bạn đã thử ping tới địa chỉ chưa? –

+2

bạn có đặc quyền root không? nếu không, hãy thử w/... – bestsss

+0

@pangea ya đã thử và nó được ping – codeomnitrix

Trả lời

5

Dưới đây là một số chi tiết về lý do tại sao isReachable() có thể không luôn luôn làm việc như mong đợi

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

Cách chính xác cho bạn là sử dụng giao thức ICMP. Đây là những gì ping sử dụng internatlly, tôi tin. Here is an example giúp bạn bắt đầu.

+1

Liên kết javaranch có lỗi. isReachable() không yêu cầu thiết bị echo thực sự đang chạy. Nó diễn giải sự từ chối kết nối như là một thành công. – EJP

+0

Ok cảm ơn pangea tôi sẽ thử nó – codeomnitrix

+0

Bài đăng trên blogspot bị xóa? – abelito

2

Tôi đã tìm thấy giải pháp thú vị. Nếu bạn không thể chạy ứng dụng của mình dưới dạng root, bạn có thể đặt khả năng ổ cắm thô trên java:

sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java 

Và sau đó giao thức ICMP sẽ được sử dụng yêu cầu echo trên cổng TCP 7.

0

Đây là mã độc lập nền tảng, nhưng yêu cầu thông tin về bất kỳ cổng đang mở nào trên máy khác (mà chúng tôi có phần lớn thời gian).

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 { 
     try (Socket soc = new Socket()) { 
      soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); 
     } 
     return true; 
    } catch (IOException ex) { 
     return false; 
    } 
}