2011-01-03 16 views
6

Tôi đang cố gắng viết một chương trình đơn giản bằng cách sử dụng Java, với IP ở định dạng phiên bản 4 hoặc 6, sẽ trả về FQDN của nó. Mã sau hoạt động tốt khi được cung cấp địa chỉ ipv4, nhưng sẽ chỉ trả lại địa chỉ đã cho khi địa chỉ ipv6 được nhập.Tại sao lớp InetAddress của Java không giải quyết được địa chỉ ipv6 cho FQDN của họ?

InetAddress inet; 
try { inet = InetAddress.getByName(theIpAddress); } 
catch(UnknownHostException e) { System.out.println("Unknown Host"); return; } 

System.out.println(inet.getHostAddress();); 
System.out.println(inet.getHostName();); 

Bất cứ khi nào tôi nhập ipv6 getHostName() sẽ chỉ trả về cùng ipv6, ngay cả khi tôi biết rằng ipv6 sẽ chuyển thành FQDN. Ngoài ra, nếu tôi nhập tên máy chủ ipv6, chẳng hạn như ipv6.google.com, thay cho theIpAddress, ngoại lệ sẽ xảy ra.

Tôi mới sử dụng công cụ này để đánh giá cao mọi hỗ trợ. Cảm ơn.

+1

Máy chủ/mạng của bạn có chắc chắn có IPv6 DNS hoạt động không? Liệu nslookup có được kết quả đúng không? –

+0

Có. nslookup hoạt động tốt. – user561877

Trả lời

1

Hãy thử inet.getCanonicalHostName(); để "Nhận tên miền hoàn toàn đủ điều kiện cho địa chỉ IP này".

Nếu bạn xây dựng InetAddress bằng cách sử dụng InetAddress.getByName(), getHostName() sẽ trả về những gì bạn đã tạo. getCanonicalHostName() bắt buộc tra cứu tên đảo ngược.

+0

Tôi thực sự đã thử điều đó nhưng không thành công. Vẫn còn cùng một vấn đề. – user561877

2

Vấn đề thực sự là phiên bản Java mà tôi đang chạy. Cập nhật Java thành 1.6.23, từ 1.6.21, cho phép ipv6s giải quyết cho FQDN của chúng.

+2

Bạn có thể muốn đánh dấu câu trả lời của riêng mình là "câu trả lời". Nhấp vào dấu kiểm bên cạnh dấu kiểm (chuyển sang màu xanh lục). –

0

Sử dụng java.net.InetAddress nó không thể có ipv6 và độ phân giải tên ipv4 vv loạt các phương pháp tĩnh như getByName vv ủy các tra cứu để thể hiện của Inet4 (hoặc 6) AddressImpl mà không

public native InetAddress[] lookupAllHostAddr(String hostname) throws UnknownHostException; 

Bây giờ vui vẻ là a) tất cả các gói này là riêng tư/gói cục bộ, do đó không có cách nào để tiêm các lớp impl vào lớp InetAddress b) Các lớp Inet4 (hoặc 6) AddressImpl chính là gói cục bộ. Vì vậy, không có cách nào để nói, làm một ipv4 hoặc ipv6 tra cứu/tên độ phân giải trên bay. Tôi không nhận được cách tất cả các điểm mở rộng đã bị chặn cho các lớp này làm cho chúng sử dụng rất hạn chế và linh hoạt. Black-magic thực sự xảy ra ở đây, trong đó lớp InetAddress khởi tạo tĩnh impls, kết quả của phương thức isIPv6Supported() phụ thuộc vào cái gì ?? Thiết lập Linux của tôi hỗ trợ ipv6, tôi có thể thực hiện tìm kiếm dns cho tên máy chủ ipv6 như ipv6.google.com. sẽ đánh giá cao nếu ai có thể chỉ cho tôi với sự chỉ đạo của một thư viện ròng tốt trong java cho ipv4/v6 tiện ích như tra cứu, vv

class InetAddressImplFactory { 

    static InetAddressImpl create() { 
    Object o; 
    if (isIPv6Supported()) { 
     o = InetAddress.loadImpl("Inet6AddressImpl"); 
    } else { 
     o = InetAddress.loadImpl("Inet4AddressImpl"); 
    } 
    return (InetAddressImpl)o; 
    } 

    static native boolean isIPv6Supported(); 
} 
1

tôi đã thực hiện một cuộc điều tra nhanh về những gì đang xảy ra với hostname < -> Độ phân giải ipv6 trong java 8, Windows 7. Có vẻ như 'mặc định' NameService không hoạt động với ipv6! Nhưng! Java đi kèm với một triển khai thực hiện NameService dựa trên JNDI khác gọi là 'dns, sun'. Vì vậy, nếu bạn kích hoạt nó bằng cách sử dụng

-Dsun.net.spi.nameservice.provider.1 = dns, mặt trời

hoặc

System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun"); 

bạn sẽ nhận được hai chiều ip < - độ phân giải> hostname cho các địa chỉ v4 và v6 như

InetAddress.getAllByName(...) 
address.getHostName() 

Thông tin thêm này về ipv6 java bạn có thể tìm thấy ở đây http://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/

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