Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0023: Dynamische IP-Adresse auslesen, DNS nutzen

 von 

Beschreibung 

Dieser etwas umfangreichere Tipp dient dazu IP-Adressen von Rechnernamen (z.B.: Domänen) zu ermitteln. Es kann dabei über eine bestehende Online Verbindung auf den DNS des Providers zugefriffen werden. Dadurch ist die Umrechnung zwischen IP-Nummer und Rechnername bzw. umgekehrt möglich. Zudem ist daß ganze auch noch Offline auf ein Netzwerk anwendbar. Weiterhin nutzt dieser Tip die Möglichkeiten der automatischen Einwahl, als auch die Abfrage des DFÜ-Status.Bitte berücksichtigen Sie, dass der Tip natürlich nur dann einwandfrei funktionieren kann, wenn, wie bereits wie auf fast jedem Rechner voreingestellt, der DNS aktiviert ist. Wer nur fix seine IP auslesen möchte ist mit Tipp 378 besser bedient.

Schwierigkeitsgrad:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

RasEnumConnectionsA (RasEnumConnections), RasEnumEntriesA (RasEnumEntries), RasGetConnectStatusA (RasGetConnectStatus), RasHangUpA (RasHangUp), RtlMoveMemory, WSACleanup, WSAGetLastError, WSAStartup, gethostbyaddr, gethostbyname, gethostname

Download:

Download des Beispielprojektes [5,21 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias FORM1.FRM  ---------
' Steuerelement: Schaltfläche "Command6"
' Steuerelement: Rahmensteuerelement "Frame2"
' Steuerelement: Timersteuerelement "Timer1" auf Frame2
' Steuerelement: Schaltfläche "Command7" auf Frame2
' Steuerelement: Schaltfläche "Command5" auf Frame2
' Steuerelement: Listen-Steuerelement "List1" auf Frame2
' Steuerelement: Textfeld "Text5" auf Frame2
' Steuerelement: Schaltfläche "Command1" auf Frame2
' Steuerelement: Schaltfläche "Command2" auf Frame2
' Steuerelement: Rahmensteuerelement "Frame1"
' Steuerelement: Textfeld "Text4" auf Frame1
' Steuerelement: Textfeld "Text3" auf Frame1
' Steuerelement: Schaltfläche "Command3" auf Frame1
' Steuerelement: Schaltfläche "Command4" auf Frame1
' Steuerelement: Textfeld "Text1" auf Frame1
' Steuerelement: Textfeld "Text2" auf Frame1
' Steuerelement: Beschriftungsfeld "Label2" auf Frame1
' Steuerelement: Beschriftungsfeld "Label1" auf Frame1
' Steuerelement: Beschriftungsfeld "Label3"

Option Explicit

Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () _
        As Long
        
Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
        wVersionRequired As Long, lpWSAData As WinSocketDataType) _
        As Long
        
Private Declare Function WSACleanup Lib "WSOCK32.DLL" () _
        As Long
        
Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal _
        HostName As String, ByVal HostLen As Integer) As Long
        
Private Declare Function gethostbyname Lib "WSOCK32.DLL" _
        (ByVal HostName As String) As Long
        
Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" _
        (ByVal addr As String, ByVal laenge As Integer, ByVal typ As Integer) As Long
        
Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As _
        Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

Const WS_VERSION_REQD As Long = &H101&

Const SOCKET_ERROR  As Long = -1
Const WSADescription_Len As Long = 256
Const WSASYS_Status_Len As Long = 128

Private Type HostDeType
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLength As Integer
    hAddrList As Long
End Type

Private Type WinSocketDataType
    wversion As Integer
    wHighVersion As Integer
    szDescription(0 To WSADescription_Len) As Byte
    szSystemStatus(0 To WSASYS_Status_Len) As Byte
    iMaxSockets As Integer
    iMaxUdpDg As Integer
    lpszVendorInfo As Long
End Type


'### Der folgende Abschnitt dient nur dazu, um festzustellen
'    ob eine Online-Verbindung besteht bzw. um diese herzu-
'    stellen und wieder abzubrechen.
'    Sie können diesen Block bei Verzicht dieser Funktionen
'    getrost löschen

Private Declare Function RasEnumConnections Lib "RasApi32.DLL" _
        Alias "RasEnumConnectionsA" (lpRasCon As Any, lpcb As _
        Long, lpcConnections As Long) As Long
        
Private Declare Function RasGetConnectStatus Lib "RasApi32.DLL" _
        Alias "RasGetConnectStatusA" (ByVal hRasCon As Long, _
        lpStatus As Any) As Long

Private Declare Function RasEnumEntries Lib "RasApi32.DLL" _
        Alias "RasEnumEntriesA" (ByVal reserved As String, ByVal _
        lpszPhonebook As String, lprasentryname As Long, lpcb As Long, _
        lpcEntries As Long) As Long
        
Private Declare Function RasHangUp Lib "RasApi32.DLL" _
        Alias "RasHangUpA" (ByVal hRasConn As Long) As Long

Const RAS_MaxEntryName As Long = 256&
Const RAS_MaxDeviceType As Long = 16&
Const RAS_MaxDeviceName As Long = 32&

Private Type RASType
    dwSize As Long
    hRasCon As Long
    szEntryName(RAS_MaxEntryName) As Byte
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Type RASStatusType
    dwSize As Long
    RasConnState As Long
    dwError As Long
    szDeviceType(RAS_MaxDeviceType) As Byte
    szDeviceName(RAS_MaxDeviceName) As Byte
End Type

Private Type RASENTRYNAME95
    dwSize As Long
    szEntryName(RAS_MaxEntryName) As Byte
End Type

Dim DFUEName As String

Private Function DFUEStatus() As Boolean
    Dim RAS(255) As RASType, RASStatus As RASStatusType
    Dim lg As Long, lpcon As Long, Result As Long

    RAS(0).dwSize = 412
    lg = 256 * RAS(0).dwSize
    Result = RasEnumConnections(RAS(0), lg, lpcon)
    
    If lpcon = 0 Then
        DFUEStatus = False
        Label3.Caption = "Offline"
    Else
        RASStatus.dwSize = 160
        Result = RasGetConnectStatus(RAS(0).hRasCon, RASStatus)
        If RASStatus.RasConnState = &H2000 Then
            DFUEStatus = True
            Label3.Caption = "Online"
        Else
            DFUEStatus = False
            Label3.Caption = "Einwahl oder Trennen der Verbindung"
        End If
    End If
End Function

Private Function Online() As Boolean
    Dim Test As Boolean
    
    Test = DFUEStatus
    If Test = False Then Call MsgBox _
        ("Keine Online Verbindung vorhanden! Bitte einwählen!")
    
    Online = Test
End Function

Private Function GetDFUE() As String
    Dim s As Long, ln As Long
    Dim i As Integer
    Dim r(255) As RASENTRYNAME95
    
    r(0).dwSize = 264
    s = 256 * r(0).dwSize
    Call RasEnumEntries(vbNullString, vbNullString, VarPtr(r(0)), s, ln)
    DFUEName = StrConv(r(i).szEntryName(), vbUnicode)
    DFUEName = Left$(DFUEName, InStr(DFUEName, vbNullChar) - 1)
    Shell "rundll32.exe rnaui.dll,RnaDial " & DFUEName
    Shell "rundll32.exe rnaui.dll,RnaDial " & DFUEName
End Function

Private Sub HangUp(ByVal Verbindung$)
    Dim s As Long, l As Long, ln As Long
    Dim rec As Long
    Dim aa As String
    ReDim r(255) As RASType

    r(0).dwSize = 412
    s = 256 * r(0).dwSize
    l = RasEnumConnections(r(0), s, ln)
    
    For l = 0 To ln - 1
        aa = StrConv(r(l).szEntryName(), vbUnicode)
        aa = Left$(aa, InStr(aa, Chr$(0)) - 1)
        If aa = Verbindung Then rec = RasHangUp(r(l).hRasCon)
    Next l
End Sub

Private Sub Form_Load()
    Command1.Caption = "Eigene Adresse ermitteln"
    Command2.Caption = "Dynamische IP-Adressen"
    Command3.Caption = "IP->Name"
    Command4.Caption = "Name->Ip"
    Command5.Caption = "Einwählen"
    Command6.Caption = "Beenden"
    Command7.Caption = "Auflegen"

    Timer1.Interval = 200
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    DFUEStatus
End Sub

Private Sub Command5_Click()
    Call GetDFUE
End Sub
Private Sub Command7_Click()
    If Len(DFUEName) > 0 Then Call HangUp(DFUEName)
End Sub
'### Ende des DFUE-Pfrüfungs Abschnitts


Private Sub Command1_Click()
    '### Eigene Adresse ermitteln
    InitSockets
    Text5.Text = MyHostName()
    CleanSockets
End Sub

Private Sub Command2_Click()
    '### Eigene IP-Adressen abfragen
    '    Diese Routine kann unteranderem dazu benutzt werden,
    '    dynamische durch einen Provider zugewiesene IP-Adressen
    '    auszulesen.
    '    Da hier alle eigenen IP ausgelesen werden müssen die statio-
    '    nären [Localhost (127.0.0.1), Netzwerk (192.168.xxx.xxx)]
    '    eleminiert werden. Entfernen Sie dann aber auch folgende
    '    Steuerelemente aus dem Form:
    '       Timer1
    '       Label3
    '       Command5
    '       Command7
 
    Dim X As Integer
    Dim IP As String, DNS As String, HOST As String
  
    If Not Online Then Exit Sub
    
    MousePointer = vbHourglass
    Call InitSockets
    HOST = MyHostName
    List1.Clear
     
    Do
        IP = HostByName(HOST, X)
        If Len(IP) = 0 Then Exit Do
          
        DNS = HostByAddress(IP)
        List1.AddItem "DNS: " & DNS & "  " & "IP: " & IP
        X = X + 1
    Loop
     
    Call CleanSockets
    MousePointer = vbDefault
End Sub

Private Sub Command3_Click()
    Dim aa As String
    '### DNS-Abfrage nach Domäne (gibt IP zurück)
    
    If Not Online Then Exit Sub
    
    MousePointer = vbHourglass
    Call InitSockets
    aa = HostByAddress(Text1.Text)
    If Len(aa) = 0 Then Call MsgBox("Nicht gefunden")
    Text4.Text = aa
    CleanSockets
    MousePointer = vbDefault
End Sub

Private Sub Command4_Click()
    Dim aa As String
    
    '### DNS-Abfrage nach IP (gibt Domäne zurück)
    If Not Online Then Exit Sub
    
    MousePointer = vbHourglass
    InitSockets
    aa = HostByName$(Text2.Text)
    If Len(aa) = 0 Then Call MsgBox("Nicht gefunden")
    Text3.Text = aa
    CleanSockets
    MousePointer = vbDefault
End Sub

Private Sub Command6_Click()
    Unload Me
End Sub

Private Function HostByAddress(ByVal Addresse$) As String
    Dim X As Integer
    Dim HostDeAddress As Long
    Dim aa As String, BB As String * 5
    Dim HOST As HostDeType
  
    aa = Chr$(Val(NextChar(Addresse, ".")))
    aa = aa + Chr$(Val(NextChar(Addresse, ".")))
    aa = aa + Chr$(Val(NextChar(Addresse, ".")))
    aa = aa + Chr$(Val(Addresse))
    
    HostDeAddress = gethostbyaddr(aa, Len(aa), 2)
    If HostDeAddress = 0 Then
        HostByAddress = ""
        Exit Function
    End If
    
    Call RtlMoveMemory(HOST, HostDeAddress, LenB(HOST))
 
    aa = ""
    X = 0
    Do
       Call RtlMoveMemory(ByVal BB, HOST.hName + X, 1)
       If Left$(BB, 1) = Chr$(0) Then Exit Do
       aa = aa + Left$(BB, 1)
       X = X + 1
    Loop
    
    HostByAddress = aa
End Function

Private Function HostByName(Name As String, Optional X As Integer = 0) As String
    Dim MemIp() As Byte
    Dim Y As Integer
    Dim HostDeAddress As Long, HostIp As Long
    Dim IpAddress As String
    Dim HOST As HostDeType
  
    HostDeAddress = gethostbyname(Name)
    If HostDeAddress = 0 Then
        HostByName = ""
        Exit Function
    End If
    
    Call RtlMoveMemory(HOST, HostDeAddress, LenB(HOST))
    
    For Y = 0 To X
        Call RtlMoveMemory(HostIp, HOST.hAddrList + 4 * Y, 4)
        If HostIp = 0 Then
            HostByName = ""
            Exit Function
        End If
    Next Y
    
    ReDim MemIp(1 To HOST.hLength)
    Call RtlMoveMemory(MemIp(1), HostIp, HOST.hLength)
    
    IpAddress = ""
    
    For Y = 1 To HOST.hLength
        IpAddress = IpAddress & MemIp(Y) & "."
    Next Y
    
    IpAddress = Left$(IpAddress, Len(IpAddress) - 1)
    HostByName = IpAddress
End Function

Private Function MyHostName() As String
    Dim HostName As String * 256
    
    If gethostname(HostName, 256) = SOCKET_ERROR Then
        MsgBox "Windows Sockets error " & Str(WSAGetLastError())
        Exit Function
    Else
        MyHostName = NextChar(Trim$(HostName), Chr$(0))
    End If
End Function

Private Sub InitSockets()
    Dim Result As Integer
    Dim LoBy As Integer, HiBy As Integer
    Dim SocketData As WinSocketDataType
    
    Result = WSAStartup(WS_VERSION_REQD, SocketData)
    If Result <> 0 Then
        Call MsgBox("'winsock.dll' antwortet nicht!")
        End
    End If
End Sub

Private Sub CleanSockets()
    Dim Result As Long
    
    Result = WSACleanup()
    If Result <> 0 Then
        Call MsgBox("Socket Error " & Trim$(Str$(Result)) & _
                " in Prozedur 'CleanSockets' aufgetreten !")
        End
    End If
End Sub

Private Function NextChar(Text$, Char$) As String
    Dim POS As Integer
    
    POS = InStr(1, Text, Char)
    If POS = 0 Then
        NextChar = Text
        Text = ""
    Else
        NextChar = Left$(Text, POS - 1)
        Text = Mid$(Text, POS + Len(Char))
    End If
End Function
'---------- Ende Formular "Form1" alias FORM1.FRM  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 15 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Mehmet Kazanci am 17.03.2009 um 08:59

Hallo Jungs!!

Ich hab mal ne frage! Hört mal wir haben so ein großes Projekt in der Schule Angefangen! Wir programmieren mit einem ganzen Kurs Schiffeversenken! Ich muss den Server für das Programm mit VB6 Programmieren, aber ich komm hier aber nicht richtig weiter! Mit Ip adressen erkennen, im Netzwerkverstreuen und etc. pp. Bestimmt hat jemand von euch ahnung davon! Ich kann es nicht so ganz gut! Also am besten wäre es wenn es so einfach wie möglich zu machen ist!

ich bedanke mich schon mal im Voraus das sie meine Frage gelesen haben und erwarte eine Antwort!

Kommentar von Fabian am 16.11.2005 um 22:11

Hallo,
es funktioniert. Ich schafe es nicht den PING_TIMEOUT runterzusetzen. Icha ihn schon von 200& auf 1& geändert, keine veränderung. Da ich mit dem ping 255 Ip's anpingen möchte währe es sehr gut den timeout bei einer nicht vorhanden ip runterzusetzn. so daurt es ca. 3 minuten bis alle 255 Ip's durch sind. Vieleicht kann mir jemand helfen.

Kommentar von Matthias am 23.07.2003 um 09:46

Guten Tag auch,

dieses Progg ist unnuetz und sollte von active VB runter kommen.Kommt ned mit Proxies klar! Und hat, somit nix zu suchen!

Kommentar von Ramona P. am 15.07.2003 um 11:47

ich bin echt am Ende . Hier im internet versucht mich jemand fertig zu machen und der muss über mich sehr viel wissen und bedroht mich nun.Ich habe seine IPs und wundere mich nur dass es zwei verschiedene sind.Könnte mir jemand dabei helfen um aus den IP Nummer wenigstens seine Email raus zu finden so das ich weiß wer diese Person ist und ich ihn belangen kann .
IP.217.0.109.66
IP.217.0.103.103

Ich Danke mal hier in voraus und freue mich wenn hier jemand ist der mir da weiter Helfen kann

Grüße aus München R.P

Kommentar von Martin am 25.04.2003 um 08:56

Hi Markus
Nicht Hacks oder sonstwas unternehmen! Damit machst Du Dich nur selber strafbar. Besser ist, (z.B. über http://www.nic.de/) den Besitzer der Webseite ausfindig zu machen und nötigenfalls per Einschreiben und Anwalt zum sofortigen Rückzug zu bewegen.

Kommentar von markus am 08.04.2003 um 16:04

Jemand stellt Anzeigen (boese) ins Netz mit meiner email adresse. Durch einen Provider habe ich seine IP Adresse ubermittelt bekommen. Wie kann ich Ihn stoeren hacken oder sonstwas dagegen unternehmen ?

Kommentar von Meteger am 16.02.2003 um 16:01

@kenan: in der dos box gibst einfach "ping seineip" ein, wenn du packete zurückbekommst isser online, wenn du keine kriegst is er offline

Kommentar von JoG am 07.08.2002 um 15:29

Also, das Ding läuft auch mit VB5 und NT 4.0 nicht. RNAUI.DLL fehlt! Was soll das überhaupt sein?

Kommentar von IVHP am 03.08.2002 um 17:45

Also, mal der Reihe nach.. das ist ja ein grosse Chaos hier.
1. um seine eigene dynamische IP auszulesen braucht man so gut wie gar nichts. unter windows kann man sich das mit ipconfig anzeigen lassen oder winipcfg. beides von Hause aus in windows drin, über die Eingabeaufforderung zu starten. Wem das zu stressig ist kann auch eine der vielen vielen Seiten im Netz aufrufen (z.B. http://have-a-nice-day.ath.cx/cgi-bin/iinfo), die unter "Ihr Rechner" oder "Ihre IP" einem die dynamische IP sagen.
2. Zu der IP von chattern. !. braucht man die eigentlich nicht.. und zweitens: bei AIM/AOL kann man sie nicht (ohne weiteres) bekommen, weil üpber einen zentralen server gechattet wird. Also keine IP's von Leuten mit denen ihr über AIM chattet.
BEi ICQ wurde es schon gesagt, die Verbindungen kann man mit netstat aus der Eingabeaufforderung erfahren.
Jetzt zu IRC: Das hängt ein bischen vom Anbieter ab. Wer z.B. über freenet.de im IRC chattet kann sich die IPs NICHT angucken, da diese verschlüsselt werden. (daran ändert auch ide Benutzung von chat-clients wie htirc, mirc usw etwas. da steht dann zwar was, aber das ist nicht die ganze IP). wer bei einem der unzähligen anderen IRC-anbieter chattet kann die IP sehen.. und zwar über die eingabe des Befels /dns nickname. das spuckt die IP des jehweiligen nicknamens aus. oder aber einfach mit Mirc rechtsklick und Info... da steht auch die IP.

Kommentar von Sven Ziesche am 11.02.2002 um 18:06

habe das Beispiel unter win 2000 laufen lassen. Allerdings bekomme ich eine Fehlermeldung beim Einwählen (egal, ob die DFÜ schon aktiv ist oder nicht):"Fehler beim Laden von rnaui.dll"
Habe mir dann diese nicht vorhandene Datei besorgt und ins system32 Verzeichnis gespielt; ohne Erfolg.
Bitte um Mail
Danke

Kommentar von Death_revelation am 07.12.2001 um 16:56

Wenn du im ICQ chattest, dann probiers mal mit dem Dos. gib dort:
"netstat -n"
ein. Dann bekommst du eine Liste mit IP's, daneben den Status. Eine IP gehört dem Benutzer von ICQ am anderen Ende. ABER NICHT HACKEN! ;-)

Kommentar von David E. am 18.06.2001 um 13:38

Hi,
seit dem ich DSL habe stürzt VB6.0 ab wenn ich den Tip starte.
Selbst die ermittlung
der IP über .LocalIP vom Winsock. Bringt wenn ich es in einer Schleife laufen lasse, mein VB zum Kapitulieren.
Auch das Windowstool WINIPCFG stürzt und hängt.
MfG
David E.

Kommentar von Max am 07.05.2001 um 14:46

Wenn ich jetzt aber auf einwählen klicke öffnet der irgendetwas, wo ich mich einwählen kann.
Dabei bin ich schon in AOL eingeloggt.
Bei einem anderen Provider bin ich auch nicht angemeldet.
Muss ich da irgendwas einstellen?

Kommentar von Max am 07.05.2001 um 14:44

das geht bei mir nicht irgendwie.
Da kommt immer ne MSGBOX: "KEine Internetverbindung gefunden"

Kommentar von Alex am 13.10.2000 um 15:12

Frage: Kann mir irgendwer ein Beispiel schicken in dem nur die dynamische IP-Adresse des Providers ausgelesen wird? Danke, Alex