web-dev-qa-db-fra.com

Convertir une chaîne en InetAddress sans recherche DNS

J'ai une adresse IP locale en notation décimale en pointillés dans une variable String. Je souhaite le convertir en InetAddress pour le transmettre à Socket, mais je dois le faire sans effectuer de recherche DNS (car cela pourrait entraîner de longs délais d'attente).

Existe-t-il une méthode prête pour cela ou dois-je diviser la String et créer la InetAddress à partir de ses octets?

Update Les méthodes d'usine InetAddress.getByName() et InetAddress.getByAddress() ne semblent pas convenir, car elles acceptent toutes les deux des noms d'hôte tels que Java.Sun.com. Rien ne dit s'ils essaieront de contacter un serveur DNS lors de leur implémentation.

19
Bart Friederichs

Fait comme ça

InetAddress inetAddress = InetAddress.getByName("192.168.0.105");

Si une adresse IP littérale est fournie, seule la validité du format de l'adresse Est vérifiée.

Code source Java

// if Host is an IP address, we won't do further lookup    
if (Character.digit(Host.charAt(0), 16) != -1 || (Host.charAt(0) == ':')) {

}
22
Prabhakaran

Vous pouvez utiliser Guava's InetAddresses#forString() qui est spécifiquement documenté pour votre cas d'utilisation:

Renvoie le InetAddress ayant la représentation de chaîne donnée.
Cela évite délibérément toutes les recherches de services de noms (par exemple, pas de DNS).

(emphase ajoutée)

3
Matt Ball

La bibliothèque Java open-source IPAddress validera toutes les représentations standard d'IPv6 et IPv4 et le fera sans recherche DNS. Clause de non-responsabilité: Je suis le chef de projet de cette bibliothèque.

Le code suivant fera ce que vous demandez:

        String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
        try {
            IPAddressString str = new IPAddressString(str);
            IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
            InetAddress inetAddr = addr.toInetAddress();//convert valid address
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }
0
Sean F

Vous pouvez le faire en utilisant la méthode getByName. par exemple:

InetAddress localhost = InetAddress.getByName("127.0.0.1")

Comme il est décrit dans la documentation Java:

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

0
Ali