2008-08-15 36 views
14

Làm cách nào để xác định IP của bộ định tuyến/cổng trong Java? Tôi có thể nhận được IP của tôi một cách dễ dàng đủ. Tôi có thể nhận IP internet bằng cách sử dụng dịch vụ trên trang web. Nhưng làm thế nào tôi có thể xác định IP của gateway?Làm thế nào tôi có thể xác định IP của router/cổng của tôi trong Java?

Điều này có phần dễ dàng trong .NET nếu bạn biết cách của mình. Nhưng làm thế nào để bạn làm điều đó trong Java?

+4

Cổng/bộ định tuyến của bạn thực sự có (ít nhất) hai địa chỉ IP. Bạn đang tìm kiếm một trong những đối mặt với nút của bạn hoặc khác (s) phải đối mặt với thượng nguồn đối với các mạng khác? –

Trả lời

9

Java không làm cho điều này dễ chịu như các ngôn ngữ khác, thật không may.Đây là những gì tôi đã làm:

import java.io.*; 
import java.util.*; 

public class ExecTest { 
    public static void main(String[] args) throws IOException { 
     Process result = Runtime.getRuntime().exec("traceroute -m 1 www.amazon.com"); 

     BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream())); 
     String thisLine = output.readLine(); 
     StringTokenizer st = new StringTokenizer(thisLine); 
     st.nextToken(); 
     String gateway = st.nextToken(); 
     System.out.printf("The gateway is %s\n", gateway); 
    } 
} 

Điều này giả định rằng cổng là mã thông báo thứ hai chứ không phải là mã thứ ba. Nếu có, bạn cần phải thêm thêm st.nextToken(); để chuyển tiếp thêm một mã thông báo tại một điểm khác.

+4

-1: Tính năng này không hoạt động đối với os không phải của windows. –

+5

Trên thực tế nó không hoạt động cho một hệ điều hành Windows, như traceroute được gọi là tracert ở đó. –

1

Điều đó không dễ như âm thanh. Java là nền tảng độc lập, vì vậy tôi không chắc chắn làm thế nào để làm điều đó trong Java. Tôi đang đoán. NET liên hệ với một số trang web báo cáo lại. Có một vài cách để đi. Đầu tiên, một cái nhìn sâu hơn về giao thức ICMP có thể cung cấp cho bạn thông tin bạn cần. Bạn cũng có thể theo dõi IP bạn đi qua (tuyến đường của bạn). Khi bạn gặp một IP mà không nằm trong phạm vi sau đây:

  • 10.0.0.0 - 10.255.255.255
  • 172.16.0.0 - 172.31.255.255
  • 192.168.0.0 - 192.168.255.255

nó là IP một hop đi từ bạn, và có lẽ chia sẻ một vài octet thông tin với IP của bạn.

Chúc bạn may mắn. Tôi sẽ tò mò muốn nghe câu trả lời cuối cùng cho câu hỏi này.

1

Hãy thử kích hoạt traceroute nếu bạn có.

'traceroute -m 1 www.amazon.com' sẽ phát ra một cái gì đó như thế này:

traceroute to www.amazon.com (72.21.203.1), 1 hops max, 40 byte packets 
1 10.0.1.1 (10.0.1.1) 0.694 ms 0.445 ms 0.398 ms 

Phân tích các dòng thứ hai. Có, nó xấu xí, nhưng nó sẽ giúp bạn đi cho đến khi có ai đó viết một cái gì đó đẹp hơn.

+1

Tại sao lại là downvote? – Rydell

2

Bạn nên sử dụng một cái gì đó như checkmyip.org, sẽ xác định địa chỉ IP công cộng của bạn - không nhất thiết là bộ định tuyến hop đầu tiên của bạn: tại Uni tôi có địa chỉ IP "thực", trong khi ở nhà nó là bộ định tuyến cục bộ của tôi địa chỉ IP công cộng.

Bạn có thể phân tích trang trả lại hoặc tìm một trang web khác cho phép bạn chỉ lấy lại địa chỉ IP làm chuỗi duy nhất.

(Tôi muốn tải URL này bằng Java/bất kỳ thứ gì và sau đó nhận thông tin bạn cần).

Điều này hoàn toàn độc lập với nền tảng.

1

Matthew: Vâng, đó là những gì tôi muốn nói "Tôi có thể nhận IP internet của mình bằng dịch vụ trên trang web". Xin lỗi về việc được glib.

Brian/Nick: Traceroute sẽ ổn, ngoại trừ thực tế là rất nhiều các bộ định tuyến này có ICMP bị vô hiệu hóa và do đó nó luôn luôn quầy hàng.

Tôi nghĩ rằng sự kết hợp giữa traceroute và uPnP sẽ hoạt động. Đó là những gì tôi đã lên kế hoạch để làm, tôi chỉ hy vọng tôi đã thiếu một cái gì đó hiển nhiên.

Cảm ơn mọi người đã bình luận của bạn, vì vậy có vẻ như tôi không bỏ lỡ bất cứ điều gì hiển nhiên. Tôi đã bắt đầu thực hiện một số bit của uPnP để khám phá cổng.

2

Về UPnP: lưu ý rằng không phải tất cả các bộ định tuyến đều hỗ trợ UPnP. Và nếu họ làm điều đó có thể được tắt (vì lý do an ninh). Vì vậy, giải pháp của bạn có thể không phải lúc nào cũng hiệu quả.

Bạn cũng nên xem xét NatPMP.

Một thư viện đơn giản cho UPnP có thể được tìm thấy tại http://miniupnp.free.fr/, mặc dù đó là trong C ...

2

Để khắc phục những vấn đề đề cập với traceroute (ICMP-based, rộng diện tích hit), bạn có thể xem xét:

  1. truy cập vào IP công cộng của bạn (tránh truy cập diện rộng, nhưng vẫn là ICMP)
  2. Sử dụng tiện ích không phải ICMP như ifconfig/ipconfig (các vấn đề về tính di động với điều này).
  3. Những gì có vẻ là giải pháp tốt nhất và hầu hết các di động bây giờ là bao & phân tích cú pháp netstat (xem ví dụ mã here)
3

Trên cửa sổ phân tích đầu ra của ipconfig sẽ giúp bạn có được gateway mặc định, mà không cần chờ đợi một dấu vết.

23

Trên Windows, OSX, Linux, vv sau đó câu trả lời Chris Bunch có thể được cải thiện hơn nhiều bằng cách sử dụng

netstat -rn 

ở vị trí của một lệnh traceroute.

Địa chỉ IP của cổng của bạn sẽ xuất hiện trong trường thứ hai của dòng bắt đầu default hoặc 0.0.0.0.

này được xung quanh một số vấn đề với cố gắng sử dụng traceroute:

  1. trên Windows traceroute thực sự là tracert.exe, vì vậy không cần cho O/S phụ thuộc vào mã
  2. đó là một lệnh nhanh chóng chạy - nó được thông tin từ các O/S, không phải từ mạng
  3. traceroute đôi khi bị chặn bởi mạng

Nhược điểm duy nhất là nó sẽ là cần thiết để giữ cho dòng đọc từ đầu ra netstat cho đến khi dòng bên phải được tìm thấy, vì sẽ có nhiều hơn một dòng đầu ra.

EDIT: Default Gateway IP Address là trong lĩnh vực thứ hai của dòng bắt đầu với 'mặc định' nếu bạn đang ở trên một MAC (thử nghiệm trên Lion), hoặc trong lĩnh vực thứ ba của dòng bắt đầu với '0.0.0.0' (thử nghiệm trên Windows 7)

Windows:

Mạng Destination Netmask Gateway Interface Metric

0.0.0.0 0.0.0.0 192.168.2.254 192.168.2.46 10

Mac:

Flags Destination Cổng Refs Sử dụng Netif Hết Hạn

mặc định 192.168.2.254 UGSc 104 4 en1

4
try{ 

    Process result = Runtime.getRuntime().exec("netstat -rn"); 

    BufferedReader output = new BufferedReader 
    (new InputStreamReader(result.getInputStream())); 

    String line = output.readLine(); 
    while(line != null){ 
    if (line.startsWith("default") == true) 
     break;  
    line = output.readLine(); 
    } 


    StringTokenizer st = new StringTokenizer(line); 
    st.nextToken(); 
    gateway = st.nextToken(); 

    st.nextToken(); 
    st.nextToken(); 
    st.nextToken(); 

    adapter = st.nextToken(); 

}catch(Exception e) { 
    System.out.println(e.toString()); 
    gateway = new String(); 
    adapter = new String(); 
} 
+0

Dòng cũng có thể bắt đầu bằng '0.0.0.0' thay vì' mặc định' –

1

Bạn có thể truy vấn URL "http://whatismyip.com/automation/n09230945.asp". Ví dụ:

BufferedReader buffer = null; 
    try { 
     URL url = new URL("http://whatismyip.com/automation/n09230945.asp"); 
     InputStreamReader in = new InputStreamReader(url.openStream()); 
     buffer = new BufferedReader(in); 

     String line = buffer.readLine(); 
     System.out.println(line); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (buffer != null) { 
       buffer.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
2

đầu ra của netstat -rn là ngôn ngữ cụ thể. trên hệ thống của tôi (locale = de) đầu ra trông giống như: ... Standardgateway: 10.22.0.1

vì vậy không có dòng bắt đầu với 'mặc định'.

vì vậy việc sử dụng netstat có thể không có ý tưởng hay.

+0

hệ điều hành nào? Trên OSX không có sự khác biệt về mặt địa phương trong đầu ra. – Alnitak

2

Phiên bản này kết nối với www.whatismyip.com, đọc nội dung của trang web và tìm kiếm thông qua cụm từ thông dụng địa chỉ ip và in nó vào cmd. Của nó một chút cải thiện MosheElishas Mã

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     BufferedReader buffer = null; 
     try { 
      URL url = new URL(
        "http://www.whatismyip.com/tools/ip-address-lookup.asp"); 
      InputStreamReader in = new InputStreamReader(url.openStream()); 
      buffer = new BufferedReader(in); 
      String line = buffer.readLine(); 
      Pattern pattern = Pattern 
        .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)"); 
      Matcher matcher; 
      while (line != null) { 
       matcher = pattern.matcher(line); 
       if (matcher.matches()) { 
        line = matcher.group(2) + "." + matcher.group(3) + "." 
          + matcher.group(4) + "." + matcher.group(5); 
        System.out.println(line); 
       } 
       line = buffer.readLine(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } finally { 
      try { 
       if (buffer != null) { 
        buffer.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     BufferedReader buffer = null; 
     try { 
      URL url = new URL(
        "http://www.whatismyip.com/tools/ip-address-lookup.asp"); 
      InputStreamReader in = new InputStreamReader(url.openStream()); 
      buffer = new BufferedReader(in); 
      String line = buffer.readLine(); 
      Pattern pattern = Pattern 
        .compile("(.*)value=\"(\\d+).(\\d+).(\\d+).(\\d+)\"(.*)"); 
      Matcher matcher; 
      while (line != null) { 
       matcher = pattern.matcher(line); 
       if (matcher.matches()) { 
        line = matcher.group(2) + "." + matcher.group(3) + "." 
          + matcher.group(4) + "." + matcher.group(5); 
        System.out.println(line); 
       } 
       line = buffer.readLine(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 

     } finally { 
      try { 
       if (buffer != null) { 
        buffer.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
1

Trong cửa sổ bạn chỉ có thể sử dụng lệnh sau:

ipconfig | findstr /i "Gateway" 

Mà sẽ cung cấp cho bạn kết quả như:

Default Gateway . . . . . . . . . : 192.168.2.1 
Default Gateway . . . . . . . . . : :: 

Tuy nhiên tôi không thể chạy lệnh này với Java, sẽ đăng khi tôi tìm ra điều này.

1

Bạn có thể sử dụng lệnh netstat -rn có sẵn trên nền tảng Windows, OSX, Linux, v.v. Đây là mã của tôi:

private String getDefaultAddress() { 
     String defaultAddress = ""; 
     try { 
      Process result = Runtime.getRuntime().exec("netstat -rn"); 

      BufferedReader output = new BufferedReader(new InputStreamReader(
        result.getInputStream())); 

      String line = output.readLine(); 
      while (line != null) { 
       if (line.contains("0.0.0.0")) { 

        StringTokenizer stringTokenizer = new StringTokenizer(line); 
        stringTokenizer.nextElement(); // first element is 0.0.0.0 
        stringTokenizer.nextElement(); // second element is 0.0.0.0 
        defaultAddress = (String) stringTokenizer.nextElement(); 
        break; 
       } 

       line = output.readLine(); 

      } // while 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return defaultAddress; 

} // getDefaultAddress 
Các vấn đề liên quan