VB 5/6-Tipp 0023: Dynamische IP-Adresse auslesen, DNS nutzen
von ActiveVB
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: | Verwendete API-Aufrufe: RasEnumConnectionsA (RasEnumConnections), RasEnumEntriesA (RasEnumEntries), RasGetConnectStatusA (RasGetConnectStatus), RasHangUpA (RasHangUp), RtlMoveMemory, WSACleanup, WSAGetLastError, WSAStartup, gethostbyaddr, gethostbyname, gethostname | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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