IP Ermittlung

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    IP Ermittlung

    Heyho zusammen

    Ich wollte gerade die IP eines Netzwerkcomputers auslesen.
    Funktioniert auch ohne Probleme.

    Ausnahme:
    Wenn der entsprechende Computer ausgeschalten ist, ist es mir nicht möglich die IP auszulesen:


    Gibt ja theoretisch Sinn, aber mit dem Ping Kommando der Konsole krieg ich eine IP, aber keine Antwortpakete:


    Wie funktioniert das überhaupt? Und wie krieg ich das mit VB.Net hin?

    Greez & Danke
    Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Hat was mit dem DNS-Cache zu tun. Wenn in der Konsole die IP-Adresse des Hosts bekannt ist, obwohl der Host selbst nicht erreichbar ist, dann stammt die Information der Zuordnung Hostname -> IP-Adresse nicht vom Host selbst, sondern vom DNS (Domain Name Server). In einem lokalen Netzwerk gibt es diesen DNS nicht, stattdessen tauschen die Windows-Systeme mit einem Windows-eigenen Protokoll (WINS oder sowas ähnliches) untereinander die Informationen aus, welcher Rechner welchen Namen hat und unter welcher IP-Adresse er erreichbar ist. Und das geht natürlich nur, wenn der entsprechende Rechner an ist.
    Im Internet hingegen übernehmen Domain Name Server diese Aufgabe und damit nicht jede Nameserver-Anfrage (es gibt Milliarden davon pro Sekunde auf der ganzen Welt) jedesmal komplett bis zum Provider des Zielrechners durchgeroutet werden muss, halten die Nameserver-Relays einen eigenen Cache und starten erst dann eine neue Anfrage, wenn für einen bekannte IP-Adresse die Haltezeit abgelaufen ist (diese Haltezeit wird vom Provider bzw. Heimat-Nameserver des Zielrechners festgelegt). Und da kann es durchaus vorkommen, dass die Haltezeit noch nicht rum ist, obwohl der betroffene Rechner längst nicht mehr verfügbar ist, d.h. die Nameserver-Abfrage geht durch, aber wenn du dann die ermittelte IP direkt anpingst, findet der Ping natürlich keine Gegenstelle mehr.

    Gehen deine beiden Beispiele .NET-Programm und Konsole auf den selben Hostnamen? Wenn ja, welche wurde zuerst ausgeführt und wieviel Zeitabstand lag dazwischen?
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Also wenn ich das richtig verstanden habe: Der Cache der IP wird durch die Haltezeit mittels WINS definiert?
    Also muss es doch theoretisch möglich sein, mit VB eine "manuelle" Anfrage an den Server zu senden (à la "hier haste hostname, gib mir ip").

    Arby schrieb:

    selben Hostnamen?
    Ja

    Arby schrieb:

    Wenn ja, welche wurde zuerst ausgeführt und wieviel Zeitabstand lag dazwischen?
    1. Programm (keine IP bekommen)
    2. Konsole (IP bekommen)
    3. Programm (keine IP bekommen)

    Ausgeführt unmittelbar nacheinander (max. 30 Sec.)
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Die VB Klasse prüft wohl gleich ob der Host erreichbar ist und wirft deswegen die Exception. Die Konsole hingegen bekommt die IP vom DNS zurück und versucht dann diese anzupingen.

    Ob man mit VB eine direkte Abfrage an den DNS ohne Check durchführen kann weiß ich allerdings nicht. Wozu brauchst du das denn?

    Edit: Habs mal getestet und bei mir funktioniert das, hab ein Hostname eingetragen den es im DNS gibt, allerdings gibt es den PC dazu nicht mehr und als Rückgabe bekomme ich die IP des PCs

    VB.NET-Quellcode

    1. Dim ips As IPAddress()
    2. ips = Dns.GetHostAddresses("unbekannter host")
    3. TextBox1.Text = "GetHostAddresses(antes) returns: "
    4. Dim index As Integer
    5. For index = 0 To ips.Length - 1
    6. TextBox1.Text &= ips(index).ToString() & vbNewLine
    7. Next index
    8. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    Eine DNS-Abfrage darf meines Erachtens nie einen Host-Check beinhalten.
    Wie soll der DNS-Server denn prüfen, ob der Host lebt?
    Auf Ping zu antworten ist zwar üblich, aber keineswegs erforderlich.
    Ich kenne genügend Hosts, die nur auf einem einzigen Port antworten und jegliche andere Kommunikation (incl. ICMP) verweigern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Nunja, dem Code im Eröffnungspost zu folge scheint die Methode Dns.GetHostEntry() trotzdem eine Exception zu werfen bei einem nicht erreichbaren Host. Wobei natürlich interessant wäre bei welcher Zeile die Exception ausgelöst wird. Ob bereits beim GetHostEntry() oder erst später.

    Dodo schrieb:

    Ob man mit VB eine direkte Abfrage an den DNS ohne Check durchführen kann weiß ich allerdings nicht.
    Schade.

    Dodo schrieb:

    Wozu brauchst du das denn?
    "Brauchen" ist übertrieben. Es war eher ein Feature im Sinn von "Letzte IP:". Nun treibt mich aber meine Neugier :)

    petaod schrieb:

    Ich kenne genügend Hosts, die nur auf einem einzigen Port antworten und jegliche andere Kommunikation (incl. ICMP) verweigern.
    Die Computer antworten normal, wenn sie laufen.

    Dodo schrieb:

    Wobei natürlich interessant wäre bei welcher Zeile die Exception ausgelöst wird.
    Die Zeile ist extra rot markiert ;)

    Greez & Thanks
    Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    petaod schrieb:

    Eine DNS-Abfrage darf meines Erachtens nie einen Host-Check beinhalten.
    Der Ansicht bin ich auch. Das wäre ja grausam, wenn das so wäre.

    Das Problem scheint einfach zu sein, dass der Host nicht existiert. Vergewissere dich am besten noch mal, dass du den Host richtig geschrieben hast und nicht noch irgendwo ein Stück Whitespace hängt oder du den vollqualifizierten Hostname angeben muss (falls dieser anders ist).
    Falls der Host nicht mehr existiert, da er z. B. umbeannt wurde, solltest du mal deinen DNS-Cache leeren (ipconfig /flushdns) und überprüfen, ob das Problem fortbesteht.

    Ansonsten würde ich vorschlagen, dass du den Rechner mal anschaltest. Wie Arby schon schrieb, läuft das in vielen lokalen Netzwerken über WINS. Es könnte sein, dass der Host nicht an ist, deshalb seinen Namen nicht verbreiten kann und die Dns.GetHostEntry() den DNS-Cache nicht berücksichtigt. Demzufolge wird er nicht gefunden. Vielleicht geht die Methode aber auch zum falschen DNS-Server.
    Viele Homerouter haben auch einen eingebauten DNS-Server. So kann der FQHN eines Hosts in einem Firtzbox-Netzwerk z. B. pcname.fritz.box sein.

    Der Code, mit dem du das Ergebnis der Abfrage handlest, sieht übrigens nicht sonderlich sauber aus. Besonders das überprüfen auf IPv4 ist recht grausam. Die IPAddress-Klasse hat dafür die AddressFamily-Eigenschaft.

    Edit:
    Laut StackOverflow könnte es daran liegen, dass die Methode auch gleichzeitig einen Reverse-Lookup macht. Versuch es mal mit Dns.GetHostAddresses().
    Von meinem iPhone gesendet

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „nikeee13“ ()