Subnetz auslesen?

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Touche.

    Subnetz auslesen?

    Hallo,

    ich habe mir ein Programm mit Visual-Studio geschrieben, mit welchem ich mich in meinem privaten Netzwerk in die unterschiedlichen PC´s einloggen kann per anklicken des jeweiligen Buttons.

    Da ich 2 unterschiedliche Standorte habe und diese unterschiedliche Subnetze haben (Bsp. Haus-A hat 192.168.1.xxx und Haus-B hat 192.168.178.xxx), würde ich gerne, dass in meinem Tool über eine Textbox oder ähnliches mir ausgegeben wird : "sie sind im Netzwerk HausA" wenn meine eigene IP-Adresse durch DHCP 192.168.1.xxx ist und für Haus-B genau das gleiche...

    Leider habe ich eine komplette Denkblockade und weiss einfach nicht wie ich das realisieren kann. Könntet ihr mir bitte helfen?

    Habe auch schon gegooglet und hier im Forum die SuFu benutzt, leider ohne Erfolg.


    Danke schon mal im Vorraus und liebe Grüße!
    hmm ok, ich versuchs nochmal anders zu erklären.
    also ich stöpsel mich mit meinem notebook an ein Netzwerk im Haus-A. mein Notebook bekommt nun vom Netzwerk per DHCP eine IP-Adresse zugeteilt, welche irgendwo zwischen 192.168.1.1 und 192.168.1.255 liegt.
    Nun öffne ich mein Programm. Jetzt soll mir das Programm in einer Textbox sagen "Du bist im Netzwerk Haus-A". Das heisst die letzte Stelle in der IP-Adresse kann immer unterschiedlich sein. Es müsste also irgendwie das Subnetz ausgelesen werden.

    Effizient schrieb:

    Hilft dir denke ich weiter:

    WMI ist hier absolut unnötig und in-Effizient, besser wären hier die Methoden der DNS Klasse:

    VB.NET-Quellcode

    1. ' eigene IP Adressen herausfinden -> ergibt ip4 und IPv6 Adressen
    2. Dim ips As IPAddress() = Dns.GetHostEntry("localhost").AddressList
    3. ' durchlaufen: die IPV4 Adresse hat die Adressfamily InterNetwork
    4. For Each ip In ips
    5. ' nur zum Anschauen
    6. Debug.Print("ip: {0} {1}", ip, ip.AddressFamily)
    7. ' Abfrage auf IPV4
    8. If ip.AddressFamily=Sockets.AddressFamily.InterNetwork then ....
    9. Next

    Geht auch als Einzeiler per LinQ, aber so ist es vielleicht verständlicher ( und funktioniert dazu auch in .NET 2.0 / Mono).

    @Effizient um Hilfreich-Bewertungen zu betteln ist ... billig.

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

    Hallo,

    @Touche : wo muss ich in deinem Code eintragen, dass das Subnetz 1 oder 178 gemeint ist?

    mein code sieht bis jetzt so aus :

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.Net
    4. Imports System.Net.Sockets
    5. Imports System.Runtime.InteropServices
    6. Imports System.Net.NetworkInformation
    7. Imports System.IO
    8. Imports System.Text
    9. Imports System.Diagnostics
    10. Imports System.ComponentModel
    11. Public Class Form1
    12. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    13. Dim ips As IPAddress() = Dns.GetHostEntry("localhost").AddressList
    14. ' durchlaufen: die IPV4 Adresse hat die Adressfamily InterNetwork
    15. For Each ip In ips
    16. ' nur zum Anschauen
    17. Debug.Print("ip: {0} {1}", ip, ip.AddressFamily)
    18. ' Abfrage auf IPV4
    19. If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
    20. Label1("Du bist im Netzwerk Haus-A")
    21. If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
    22. Label1("Du bist im Netzwerk Haus-B")
    23. End If
    24. Next
    25. End Sub
    26. End Class


    Der Vorschlag von Bla wäre auch interessant, funktioniert nur leider auch nicht ;(

    zauber777 schrieb:

    wo muss ich in deinem Code eintragen, dass das Subnetz 1 oder 178 gemeint ist?

    Mein Code war eher zur Ermittlung der eigenen IPAdresse gedacht, wie gesagt geht es auch über WMI, NetworkInformation , etc. Wie ermittelst Du diese Adresse sonst ?

    zauber777 schrieb:

    Der Vorschlag von Bla wäre auch interessant, funktioniert nur leider auch nicht

    Der funktioniert prima:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. ' eigene IP Adressen herausfinden -> ergibt ip4 und IPv6 Adressen
    3. Dim ips As IPAddress() = Dns.GetHostEntry("127.0.0.1").AddressList
    4. ' durchlaufen: die IPV4 Adresse hat die Adressfamily InterNetwork
    5. For Each ip In ips
    6. ' nur zum Anschauen
    7. Debug.Print("ip: {0} {1}", ip, ip.AddressFamily)
    8. ' Abfrage auf IPV4
    9. If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
    10. Select Case True
    11. Case ip.ToString.StartsWith("192.168.1.") : MessageBox.Show("Haus A") : Exit For
    12. Case ip.ToString.StartsWith("192.168.178.") : MessageBox.Show("Haus B") : Exit For
    13. Case Else
    14. End Select
    15. End If
    16. Next
    17. End Sub
    Hallo, nun muss ich doch nochmal nachfragen.
    ich habe mein Code nun wie folgt geschrieben, aber ich bekomme keine Ausgabe in meiner Textbox.
    Ein Fehler wird mir auch nicht angegeben...

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. ' eigene IP Adressen herausfinden -> ergibt ip4 und IPv6 Adressen
    6. Dim ips As IPAddress() = Dns.GetHostEntry("LAN-Verbindung").AddressList
    7. ' durchlaufen: die IPV4 Adresse hat die Adressfamily InterNetwork
    8. For Each ip In ips
    9. ' nur zum Anschauen
    10. Debug.Print("ip: {0} {1}", ip, ip.AddressFamily)
    11. ' Abfrage auf IPV4
    12. If ip.AddressFamily = Sockets.AddressFamily.InterNetwork Then
    13. Select Case True
    14. Case ip.ToString.StartsWith("192.168.1.") : TextBox1.Text = ("Haus A") : Exit For
    15. Case ip.ToString.StartsWith("192.168.178.") : TextBox1.Text = ("Haus B") : Exit For
    16. Case Else : TextBox1.Text = ("Text")
    17. End Select
    18. End If
    19. Next
    20. End Sub
    21. End Class

    zauber777 schrieb:

    bekomme trotzdem keine ausgabe

    Also "LAN-Verbindung" ist keine zulässige HOST-Angabe: hier sind nur 'ComputerNamen' und IP-Adressen erlaubt. Insofern war '127.0.0.1' richtig.

    Was mich aber mehr irritiert ist, daß Du keine Fehlermeldung bekommst: Du hast nicht zufällig irgendwo das berühmte Try..Catch.. ex as Exception stehen ?
    Den kompletten Code habe ich dir gepostet und hier ist keine Try-Catch drin.
    Ich mach es immer so, dass ich erst einen neuen Code in einem neuen projekt ausprobiere bevor diesen in mein eigentliches projekt einbaue...
    auf der form ist nur eine textbox.

    aber was ich auch nicht verstehe, ist wenn man die ip 127.0.0.1 abfragt, dann ist es doch eigentlich logisch, dass es keine 192.168.178.x oder 192.168.1.x zurück bekommt!? aber es wird auch nicht in der textbox "text" ausgegeben.

    zauber777 schrieb:

    aber was ich auch nicht verstehe, ist wenn man die ip 127.0.0.1 abfragt, dann ist es doch eigentlich logisch, dass es keine 192.168.178.x oder 192.168.1.x zurück bekommt!?

    Die '127.0.0.1' (=localhost,Loopback) ist keine echte IP-Adresse, sie zeigt quasi immer nur auf den eigenen Computer. Mit dieser Angabe sagst Du halt nur: gib mir alle IP-Adressen für meinen eigenen Computer.

    Wenn ich bei mir Deinen String "LAN-Verbindung" einsetze, so schmeisst er mir eine NET.Socket Exception: Hostname unbekannt , warum bei Dir nicht ist mir dann unklar.

    Der Code hatte aber doch bei Dir schon mit "127.0.0.1" funktioniert , was hast Du geändert so dass er jetzt nichts mehr anzeigt ? Hast Du den Code vorher auf einem anderen Computer getestet, und jetzt auf dem Notebook ?

    Set mal wieder "127.0.0.1" ein, kommentier das gesamte Select aus und schau im Direktfenster nach welche Adressen er mit Debug.Print dort ausgibt (Du solltest im Debug-Mode sein). Gleiches nochmal mit dem Computernamen statt der "127.0.0.1". Wenn Du mit dem Debug.print nicht zurecht kommst, so nimm halt Messagebox.Show