2012-08-15 2 views
4

Y a-t-il un moyen en Java de lui dire de retourner IPv6 seulement? J'ai tout essayé et je n'arrive pas à le faire fonctionner.Renvoyer IPv6 en Java

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"); 
    } 

La ligne que j'utilise pour essayer de revenir IPv6 uniquement:

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

Cela permet de maintenir le retour IPv4. Quelqu'un at-il une idée de la raison pour laquelle il fait cela?

+0

C'est ce que j'utilise. – Nick

+0

avez-vous ipv6 activé sur votre machine? –

+0

Oui. J'ai écrit ce programme en C# et ça marche bien, je n'arrive pas à le comprendre en java. – Nick

Répondre

2

java.net.Inet6Address ne l'emporte pas sur getByName()
il renvoie toujours l'IPv4 adresse spécifique, à moins que votre paramètre lui-même est sous la forme d'une IPv6 adresse valide, dans ce cas, cette méthode renvoie un Inet6Address-Object.

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

InetAddress.getByName() - Documentation

détermine l'adresse IP d'un hôte, compte tenu de la nom de l'hôte Le nom d'hôte peut être un nom de machine, tel que "java.sun.com", ou une représentation textuelle de son adresse IP. Si une adresse IP littérale est , seule la validité du format d'adresse est vérifiée.

> Pour hôte spécifié dans l'adresse IPv6 littérale, que ce soit sous la forme définie dans RFC 2732 ou le format d'adresse IPv6 littérale défini dans la RFC 2373 est acceptée. <

Donc, si vous voulez obtenir un IPv6 Adresse vous devez définir au sein de votre paramètre ou configurer un DNS-Server pour renvoyer l'IPv6 Adresse au lieu de l'IPv4 adresse.

Une autre façon de récupérer l'adresse IPv6 est d'utiliser InetAddress.getAllByName("www.google.at") qui renvoie toutes les adresses IP connues de l'hôte.

Par exemple, vous pouvez utiliser cette méthode pour filtrer le tableau retourné, ce qui renvoie le premier IPv6-adresse ou null si l'hôte ne l'avez pas:

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

MISE À JOUR: Pour plus de fonctions , en particulier ceux affectant les serveurs DNS, je recommande d'utiliser la bibliothèque externe DNSJava, car l'implémentation Java simple du support DNS est mauvaise.
http://www.dnsjava.org/

Code actuel:

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

Désolé je suis un peu confus (sorte de nouveau à cela), donc il n'y a aucun moyen pour moi de retourner/afficher IPv6 en utilisant le nom DNS? Pour résumer, existe-t-il un moyen pour moi de renvoyer l'adresse IPv6 en utilisant le nom DNS? Merci – Nick

+0

Cela dépend du serveur DNS utilisé et bien sûr l'hôte aussi ... Si l'hôte n'a pas activé IPv6 ou le DNS ne renvoie que les adresses IPv4 vous n'avez pas de chance ... mais vous pouvez donner InetAddress.getAllByName ("stackoverflow.com") une tentative .. qui renvoie toutes les adresses IP connues pour ce domaine. – Pr0gr4mm3r

+0

Ce sont des ordinateurs locaux qui ont tous l'IPv6 activé. J'ai un programme que j'ai écrit en C# qui retourne IPv4 et IPv6 ainsi que les noms DNS complets, mais je ne peux pas comprendre comment le faire en Java. – Nick