InetAddress.getCanonicalHostName () gibt IP anstelle von Hostname @ zurü

Ich habe nach einer IP-Suche in Java für Stack Overflow gesucht, aber die Antworten stimmen mit denen überein, die ich bereits tue, und lösen mein Problem nicht.

Hier ist mein Code:

public void printHostname( String ip ) {
    System.out.println( InetAddresses.forString( ip ).getCanonicalHostName( ) );
}

InetAddresses ist nur eine Utility-Klasse aus der Guaven-Bibliothek, um ein @ zu erhalteInetAdress.

Das Problem: Dieser Code funktioniert bei einigen IP-Adressen wie erwartet und bei einigen anderen nicht.

Ein Arbeitsbeispiel

Zum Beispiel für IP 157.55.39.29 lautet die Ausgabe:

msnbot-157-55-39-29.search.msn.com

Dieses Ergebnis scheint laut Linux @ korrekt zu sehost Befehl

> host 157.55.39.29
29.39.55.157.in-addr.arpa domain name pointer msnbot-157-55-39-29.search.msn.com.
Ein nicht funktionierendes Beispiel

Für IP 123.125.71.75 ist dashost Befehl gibt zurück:

> host 123.125.71.75
75.71.125.123.in-addr.arpa domain name pointer baiduspider-123-125-71-75.crawl.baidu.com.

Aber die Ausgabe meines Java-Codes ist:

123.125.71.75

wenn die erwartete Ausgabe @ sein soll

baiduspider-123-125-71-75.crawl.baidu.com

The javadoc von getCanonicalHostName Methode sagt:

Kehrt zurück
der vollständig qualifizierte Domänenname für diese IP-Adresse oder, wenn der Vorgang durch die Sicherheitsüberprüfung nicht zulässig ist, die Textdarstellung der IP-Adresse.

aber ich bin mir ziemlich sicher, dass es kein wirkliches Problem mit einer Sicherheitsüberprüfung ist ... oder ich verstehe nicht, was falsch ist.

Haben Sie einen Vorschlag, um dieses Verhalten zu erklären? Haben Sie eine Problemumgehung?

EDIT # 1

uf der Suche nach einer Lösung habe ich versucht, die Implementierung in JDK schrittweise zu debuggen:

// first lookup the hostname
host = nameService.getHostByAddr(addr.getAddress());

/* check to see if calling code is allowed to know
 * the hostname for this IP address, ie, connect to the host
 */
if (check) {
    SecurityManager sec = System.getSecurityManager();
    if (sec != null) {
       sec.checkConnect(host, -1);
    }
}

/* now get all the IP addresses for this hostname,
 * and make sure one of them matches the original IP
 * address. We do this to try and prevent spoofing.
 */

 InetAddress[] arr = InetAddress.getAllByName0(host, check);

In diesem Code Variablehost enthält den korrekten Wert, aber die letzte Anweisung, die @ aufrugetAllByName0 wirft einUnknownHostException, das durch die Rückgabe nur der angeforderten IP behandelt wird. Die Ausnahme wird von der internen Methode @ ausgelösgetAddressesFromNameServicemit Nachricht:"java.net.UnknownHostException: baiduspider-123-125-71-75.crawl.baidu.com"

Ich weiß nicht warum.

ann ich das @ bekommhost Variablenwert, interne Ausnahme umgehen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage