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 ArbeitsbeispielZum 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 BeispielFü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 # 1uf 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ösgetAddressesFromNameService
mit Nachricht:"java.net.UnknownHostException: baiduspider-123-125-71-75.crawl.baidu.com"
Ich weiß nicht warum.
ann ich das @ bekommhost
Variablenwert, interne Ausnahme umgehen?