Merkwürdigkeiten mit getHostName()

melmager

Erfahrenes Mitglied
Code:
try {
            localHost = InetAddress.getLocalHost().getHostName();
            System.out.println("hostname "+localHost);
         
            for (InetAddress ia : InetAddress.getAllByName(localHost)) {
            System.out.println(ia);
         
        }
        } catch (UnknownHostException ex) {
            System.out.println("FAULT");
        }

er gibt als Hostname "rechner.site" raus
da ich in Linux keine Domain gesetzt habe gehe ich davon aus das Java als Standart "site" als TLD nimmt.

Leider gibts als ergebnis eine IP Adresse - die hat aber mit dem eigen Rechner nix zu tun.

Wie ich rausgefunden habe beantwortet ein DNS Server jede X beliebige rechnername mit
der TLD "site" immer mit der gleichen IP.
Das ist was Telekom eigenes - jede nicht vorhanden Rechnername wird auf eine seite der t-online
umgeleitet und die IP habe ich erhalten :mad:


Wie komme ich eigendlich an den Quellcode der JavaFunktion getHostName ?
Ich möchte sehen ob ich mit meiner Vermutung recht habe das das "site" als defaultwert
von Java kommt
 
Zuletzt bearbeitet:
Hi

zumindest eine ersion kann hier gefunden werden: http://grepcode.com/file/repository...et/InetAddress.java#InetAddress.getHostName() und da ist nichts mit site...

getHostName ist auch gar nicht dazu gedacht, den lokalen OS-Hostname auslzulesen, sondern soll einen Reverse-DNS-Request machen (außer man hat den Hostname sleber als String ins Objekt reingesetzt).

Bleibt noch ein Problem: Wenn das Ergebnis deinen richtigen lokalen Hostnamen beinhlatet (also name.site statt zB. computer-ip.ip.ip.ip.site) ist es eher kein Telekom-DNS-Server, der dir das gesagt hat (oder ich denk grad falsch). Warum denkst du, dass es ein DNS-Server der Telekom ist? Hast du speziell den angefragt, oder einfach lokal zum Testen DNS-Anfragen an "irgendwo" abgesetzt?

Was für mich mehr Sinn machen würde, dein Router beinhaltet auch einen DNS-Server, und dein Rechner hat keinen eingestellt sondern nimmt den, den der Router per DHCP bekanntgibt (sich selbst eben). DNS-Anfragen an den Router werden entweder aus dem lokalen Cache beantwortet, oder an einen echten Server weitergeleitet. Und der Router weiß bei DHCP-Verwendung den Hostnamen, kann den in den Cache adden, und damit auch alle möglichen Seltsamkeiten anstellen (wie eben .site ... mit .home und .lan hab ich das auch in anderen Fällen schon gesehen)
 
Also nach meinen Testversuchen wird bei einem Telekom Anschluss jede Anfrage mit unbekannten namen mit einem verweis auf eine t-online Seite verwiesen.
Sprich die geben eine IP / T-online.de seite zurück wenns die aufgerufene Seite nicht gibt.
O2 reagiert da anders da kommt ein unknown Host zurück (was ich auch erwartet habe).
Jedenfalls habe ich Intern keine Domain (wissentlich) gesetzt - Linux gibt bei Domainame ein "none" raus

Eigendlich wollte ich mal ne andre Version testen um die eigene IP Adress zu ermitteln und bin halt böse in die Telekom falle getappt :(

Wenn man übrigends beim String von getHostname die TLD ".site" abschneidet bekommt man dann im Anschluss die eigne IP.

Ich lasse es besser bei der vorhanden Routine :)

Und erweitere die noch - ich baue in meine HP ein Script ein das mir die IP der Anfrage zurück wirft - so habe ich dann auch die Gateway IP

ich setze mal den Code hier rein wenn der fertig ist :)

Nachtrag:
die TLD "site" kommt warscheinlich auch vom Router - sprich der Code oben geht nicht bei einem Telekom Anschluss, bei O2 geht er, weil die nix hinten dran hängen.
 
Zuletzt bearbeitet:
So wie versprochen meine derzeitige Lösung (kann man noch verbessern)

Code:
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;

public class ScanIP {

    public enum IpTyp {
        LAN, WAN;
    }

    private String iwan, ilan;
    private boolean blan, bwan;

    public ScanIP() {
        blan = false;
        bwan = false;
        localIP();
        wanIP();
    }

    private void localIP() {
        Enumeration<NetworkInterface> netinter = null;
        try {
            netinter = NetworkInterface.getNetworkInterfaces();
        } catch (Exception ex) {
            ilan = "Fail Network Interface Scan";
        }

        while (netinter.hasMoreElements()) {
            NetworkInterface ni = netinter.nextElement();

            //System.out.println("Interface " + ni.getDisplayName() );
            Enumeration<InetAddress> nip = ni.getInetAddresses();

            while (nip.hasMoreElements()) {
                InetAddress ia = nip.nextElement();
                String tip = ia.getHostAddress();
                //tip.matches("\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b ")
                if (!ia.isLoopbackAddress() & tip.matches("(\\d{1,3}\\.){3}\\d{1,3}")) {
                    //System.out.println("Scan :" + tip);
                    ilan = tip;
                    blan = true;
                }
            }
        }

    }

    private void wanIP() {
        try (java.util.Scanner s = new java.util.Scanner(new java.net.URL("https://api.ipify.org").openStream(), "UTF-8").useDelimiter("\\A")) {
            iwan = s.next();
            bwan = true;
            //System.out.println("Extern IP address is " + iwan);
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }

    }

    public boolean hasIP(IpTyp type) {
        if (type == IpTyp.LAN) {
            return blan;
        } else {
            return bwan;
        }
    }

    public String getIpAdress(IpTyp type) {
        if (type == IpTyp.LAN) {
            return ilan;
        } else {
            return iwan;
        }

    }
}

zu nutzen so:

Code:
 ScanIP sysip = new ScanIP();
  if (sysip.hasIP(ScanIP.IpTyp.LAN)) {
      System.out.println("Server has IP " + sysip.getIpAdress(ScanIP.IpTyp.LAN));
  }
  if (sysip.hasIP(ScanIP.IpTyp.WAN)) {
      System.out.println("Externe IP " + sysip.getIpAdress(ScanIP.IpTyp.WAN));
  }
 
Zurück