2012-02-15 27 views
6

Tôi đã gặp phải lỗi đã biết với Java 6 trên Windows. Sự hiểu biết của tôi là cách bình thường để có được mặt nạ mạng là tìm kiếm chiều dài tiền tố mạng và thực hiện một số thay đổi bit. Vấn đề là trên Windows chiều dài prefix thường trở lại không đúng cách, vì vậy chúng tôi có được một 128 khi chúng ta sẽ nhận được một 24 hoặc 20.Java & Windows 7: Nhận được netmask IPv4 đáng tin cậy?

Trong this solution, nó được đề nghị để đưa -Djava.net.preferIPv4Stack=true trên dòng lệnh Java. Thật không may, trên Windows 7, thêm rằng như là một tham số VM hoặc trên dòng lệnh Java dường như không có hiệu lực.

(a) Có ai biết bất kỳ công việc nào xung quanh vấn đề này có thể vẫn hoạt động trên Windows 7 không?

(b) Ngoài ra, có cách nào khác hoàn toàn để có mặt nạ mạng đáng tin cậy không?

Cảm ơn!

P.S. Here is the bug report that pertains to this.

+0

Nghi thức đúng đắn quy định rằng tôi liệt kê các địa điểm khác mà tôi đã đặt câu hỏi này: http://stackoverflow.com/questions/9299566/java-windows-7-reliably-getting-ipv4-netmask http: // www. codeguru.com/forum/showthread.php?t=521196 https://forums.oracle.com/forums/thread.jspa?threadID=2347643&tstart=0 http://www.coderanch.com/t/567601/ socket/java/Java-Windows-Đáng tin cậy-nhận-IPv –

+1

Lạ ... tùy chọn '-Djava.net.preferIPv4Stack = true' VM hoạt động trong trường hợp của tôi trong Windows 7 cho JRE 1.6. Tôi đặt điều này trong mã Java của tôi là 'System.setProperty (" java.net.preferIPv4Stack "," true ")'. Trừ khi, một cái gì đó (thư viện hoặc bất cứ điều gì) là đặt lại nó. Bạn có thể hiển thị mã netmask IP của mình không? – ecle

+0

Cảm ơn dòng mã đó. Tôi đang sử dụng Netbeans, và có một nơi để đưa các tùy chọn VM. Tôi đã thử đặt thứ -D ở đó. Không đi. Tôi cũng đang khởi chạy ứng dụng bằng cách sử dụng trình bao bọc được tạo bởi Trình cài đặt nâng cao và có nơi để đặt các tùy chọn dòng lệnh. Điều đó cũng không hiệu quả. Tôi sẽ thử đề xuất của bạn, thêm dòng mã đó vào đầu phương thức chính của tôi. Cảm ơn! –

Trả lời

3

Tùy chọn VM -Djava.net.preferIPv4Stack=true sẽ hoạt động trong bất kỳ hệ điều hành nào. Ngoài ra, nó có thể được đưa vào mã Java là System.setProperty("java.net.preferIPv4Stack","true");. Trừ khi, một cái gì đó (thư viện hoặc bất cứ điều gì) được đặt lại trạng thái thực sự của nó.

1

Vì sự cố của chúng tôi chỉ trong Windows 7, tại sao không tìm giải pháp cụ thể cho hệ điều hành? Tôi biết chúng tôi có thể khởi chạy các chương trình cửa sổ từ Java, bao gồm các dòng lệnh cửa sổ hoặc các tệp dơi. Phải có cách để chuyển hướng đầu ra của ipconfig sang tệp văn bản trong cửa sổ. Chương trình của bạn sẽ có thể nhận được mặt nạ mạng con bằng cách gọi ipconfig và sau đó đọc đầu ra.

+0

Vâng, chúng tôi đang nhìn thấy nó trong Win7, nhưng lỗi Sun không phải là cụ thể. Trong mọi trường hợp, giải pháp tương tự sẽ hoạt động trên bất kỳ phiên bản Windows nào.Tôi phải tìm hiểu làm thế nào để kiểm tra loại hệ điều hành, bắn ra một chương trình bên ngoài, và nắm bắt đầu ra của nó. Và sau đó là một tiền thưởng, có thể sử dụng một số điều regex thông minh để phân tích kết quả (thay vì viết mã tùy chỉnh để phân tích nó char-by-char). –

2

Mã bên dưới hiển thị mặt nạ mạng con. Trên máy tính có nhiều kết nối mạng (như máy tính xách tay có kết nối Ethernet không dây và Cat-5), nó có thể viết mặt nạ mạng con hai lần vì có thể có hai địa chỉ IP khác nhau cho máy khách.

String os = System.getProperty("os.name");   
    try { 
     if(os.indexOf("Windows 7")>=0) { 
      Process process = Runtime.getRuntime().exec("ipconfig"); 
      process.waitFor(); 
      InputStream commandOut= process.getInputStream(); 

      BufferedReader in = new BufferedReader(new InputStreamReader(commandOut)); 
      String line; 
      while((line = in.readLine()) !=null) { 
       if(line.indexOf("Subnet Mask")>=0) { 
        int colon = line.indexOf(":"); 
        System.out.println(line.substring(colon+2)); 
       } 
      } 
     } 
    catch(IOException ioe) { } 
    catch(java.lang.InterruptedException utoh) { } 

Mở máy tính xách tay của tôi với cả một kết nối có dây và không dây hoạt động, tôi nhận được kết quả này: 255.255.254.0 255.255.254.0

Khi tôi tắt kết nối không dây của tôi, tôi chỉ nhìn thấy một dòng đầu ra cho liên kết Ethernet có dây, như mong đợi.

+0

Đó là một câu trả lời thực sự tốt đẹp, mặc dù một bình luận từ eee ở trên đã cho tôi câu trả lời di động. Bây giờ tôi bị rách về cách xử lý tiền thưởng. –

+0

Mã ở trên là di động theo nghĩa là bạn có thể dễ dàng viết các khối mã để xử lý các phiên bản hệ điều hành khác nhau. Nếu bạn chỉ cần sửa lỗi này cho Windows 7, thì mã ở trên là những gì bạn muốn. – Thorn

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