2012-08-15 41 views
4

在Java中有告訴它只返回IPv6的方法嗎?我已經嘗試了一切,無法讓它工作。在Java中返回IPv6

try 
    { 
     InetAddress inet = InetAddress.getByName(hostName); 

     boolean status = inet.isReachable(5000); 

     if (status) 
     { 
      System.out.println(inet.getCanonicalHostName() + " Host Reached\t" + java.net.Inet6Address.getByName(hostName).getHostAddress()); 
     } 
     else 
     { 
      System.out.println(inet.getCanonicalHostName() + " Host Unreachable"); 
     } 

    } 
    catch (UnknownHostException e) 
    { 
     System.err.println("Host does not exists"); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Error in reaching the Host"); 
    } 

我用盡量只返回IPv6的線路:

System.out.println(inet.getCanonicalHostName() + " Host Reached\t" + java.net.Inet6Address.getByName(hostName).getHostAddress()); 

這使返回的IPv4。任何人都知道爲什麼要這樣做?

+0

這就是我正在使用的。 – Nick 2012-08-15 18:02:17

+0

你的機器上是否啓用了ipv6? – 2012-08-15 18:11:17

+0

是的。我用C#編寫了這個程序,它工作正常,只是無法在java中弄清楚。 – Nick 2012-08-15 18:30:35

回答

2

java.net.Inet6Address不會覆蓋getByName()
所以它總是會返回特定的IPv4地址, 除非你的參數本身是一個有效的IPv6地址的形式,在這種情況下,該方法將返回Inet6Address,惟一-對象。

例如:
getByName("stackoverflow.com") - > Inet4Address
getByName("2001:0db8:85a3:08d3:1319:8a2e:0370:7344") - >是Inet6Address

InetAddress.getByName() - 文檔

確定主機的IP地址,給定主持人的名字。主機名稱可以是機器名稱,例如「java.sun.com」,也可以是其IP地址的文本表示。如果提供的文字IP地址是 ,則只檢查地址格式的有效性。

>對於文字IPv6地址指定的主機,無論是在 RFC 2732或RFC中定義的2373字面IPv6地址格式中定義的形式是 接受。 <

所以,如果你想獲得一個IPv6的地址,你需要你的參數中定義它,或配置DNS服務器來代替返回的IPv4地址的IPv6地址。

檢索IPv6地址的另一種方法是使用InetAddress.getAllByName("www.google.at"),它返回主機的所有已知IP地址。

例如,您可以使用此方法返回的數組,返回第一個IPv6地址或null過濾如果主機沒有一個:

public Inet6Address getIPv6Addresses(InetAddress[] addresses) { 
    for (InetAddress addr : addresses) { 
     if (addr instanceof Inet6Address) { 
      return (Inet6Address) addr; 
     } 
    } 
    return null; 
} 

UPDATE: 更多功能特別是那些影響DNS服務器的,我建議使用外部庫DNSJava,因爲DNS支持的普通Java實現很差。
http://www.dnsjava.org/

目前代碼:

public class Ping 
{ 
public void pingHost (String hostName) 
{ 
    try 
    { 
     InetAddress[] inet = InetAddress.getAllByName(hostName); 

     String address = this.getIPv4Addresses(inet).getHostAddress(); 

     boolean status = this.getIPv6Addresses(inet).isReachable(5000); 

     if (status) 
     { 

      System.out.println(reverseDns(address) + " Host Reached\t" + this.getIPv6Addresses(inet).getHostAddress()); 
     } 
     else 
     { 
      System.out.println(this.getIPv6Addresses(inet).getCanonicalHostName() + " Host Unreachable"); 
     } 

    } 
    catch (UnknownHostException e) 
    { 
     System.err.println("Host does not exists"); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Error in reaching the Host"); 
    } 
} 

public Inet6Address getIPv6Addresses(InetAddress[] addresses) 
{ 
    for (InetAddress addr : addresses) 
    { 
     if (addr instanceof Inet6Address) 
     { 
      return (Inet6Address) addr; 
     } 
    } 
    return null; 
} 

public Inet4Address getIPv4Addresses(InetAddress[] addresses) 
{ 
    for (InetAddress addr : addresses) 
    { 
     if (addr instanceof Inet4Address) 
     { 
      return (Inet4Address) addr; 
     } 
    } 
    return null; 
} 

public static String reverseDns(String hostIp) throws IOException 
{ 
    Resolver res = new ExtendedResolver(); 

    Name name = ReverseMap.fromAddress(hostIp); 
    int type = Type.PTR; 
    int dclass = DClass.IN; 
    Record rec = Record.newRecord(name, type, dclass); 
    Message query = Message.newQuery(rec); 
    Message response = res.send(query); 

    Record[] answers = response.getSectionArray(Section.ANSWER); 
    if (answers.length == 0) 
     return hostIp; 
    else 
     return answers[0].rdataToString(); 
    } 

} 
+0

對不起,我有點困惑(有點新),所以我無法使用DNS名稱返回/顯示IPv6?總結一下,有沒有辦法讓我使用DNS名稱來返回IPv6地址?謝謝 – Nick 2012-08-15 18:29:40

+0

它取決於使用的DNS服務器,當然也是主機...如果主機沒有啓用IPv6或DNS只返回IPv4地址,你是運氣不好......但你可以給InetAddress.getAllByName( 「stackoverflow.com」)嘗試..它將返回此域的所有已知IP地址。 – Pr0gr4mm3r 2012-08-15 18:35:39

+0

這些都是啓用了IPv6的本地計算機。我有一個我用C#編寫的程序,它返回IPv4和IPv6以及完整的DNS名稱,但我無法弄清楚如何在Java中執行此操作。 – Nick 2012-08-15 18:41:37