Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0378: Eigene IPs schnell auslesen III

 von 

Beschreibung 

Hierbei handelt es sich um eine verkürzte Form von Tipp 23. Die dort vorgenommenen zusätzlichen DNS-Anfragen, verlangsamen das Auslesen stark. Hiermit gehts jetzt ganz fix.

Schwierigkeitsgrad:

Schwierigkeitsgrad 3

Verwendete API-Aufrufe:

RtlMoveMemory, WSACleanup, WSAGetLastError, WSAStartup, gethostbyaddr, gethostbyname, gethostname

Download:

Download des Beispielprojektes [2,83 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: Listen-Steuerelement "List1"
' Steuerelement: Beschriftungsfeld "Label1"

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)
       
Private Type HostDeType
    hName As Long
    hAliases As Long
    hAddrType As Integer
    hLength As Integer
    hAddrList As Long
End Type

Const WS_VERSION_REQD As Long = &H101&
Const MIN_SOCKETS_REQD As Long = 1&
Const SOCKET_ERROR As Long = -1&
Const WSADescription_Len As Long = 256&
Const WSASYS_Status_Len As Long = 128&

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

Private Sub GetIPs()
    Dim IP As String, Host As String
    Dim x As Integer
    
    Call InitSocketAPI
    Host = MyHostName
    List1.Clear
    
    Do
        IP = HostByName(Host, x)
        If Len(IP) <> 0 Then List1.AddItem IP
        x = x + 1
    Loop While Len(IP) > 0
    
    Call CleanSockets
End Sub

Private Sub InitSocketAPI()
    Dim Result 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 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 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 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 As String, Char As String) 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

Private Sub Form_Load()
    Call GetIPs
End Sub
'---------- 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 11 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 Chris am 03.02.2010 um 14:28

Super, damit habt ihr mir extrem geholfen. Danke!

Kommentar von Felix.S am 05.08.2009 um 21:02

IP-Adresse von einer WebSite auslesen:
http://checkip.dyndns.org/

Kommentar von g am 15.03.2008 um 00:48

Eigentlich wollte ich wissen, wie ich Winsock's dazu bringe, eine bestimmte Netzwerkkarte bzw IP zu verwenden...
(das wird dann eh schon die lösung sein ... )

Auf die Methode mit wasistmeineip.de bin ich auch gekommen und war schnell entnerft, wenn das Design dieser Seiten umgebaut wird.
Um die IP Adresse aus der Seite zu lesen hab ich eine Funktion geschustert die OOP mässig in richtung QBasic geht
dafür sämmtliche Nummern-Punkt Kombinationen ausliest in 2 oder 3 verschachtelten Do- schleifen mit ziehmlicher Trefferquote die gewünschte IP-Adresse findet.
Falls es jemand interresiert Poste ich es, sonnst ist es mir zu (peinlich)
Für eine bessere Methoden wäre ich Dankbar.

Kommentar von Frank Thompson am 15.05.2006 um 22:54

Fehler in Script ; Zeile 9 Zeichen 17;Ende erwartet.

Kommentar von Uli Hecht am 14.02.2006 um 15:08

Was wenn der PC am Router hängt...
Ich bei manchen Usern das Problem, dass die Internet IP nicht angezeigt wird (bei mir selbst schon)...

Dazu gibt es anscheinend nur unschöne Methoden, wie den Inhalt der Seite www.wasistmeineip.de auszulesen...

Kommentar von Frank Hubrach am 24.08.2005 um 09:49

Was ist wenn in diesem Rechner zwei Netzwerkkarten stecken ?

Kommentar von skorbut am 08.07.2005 um 02:47

ich verstehe nicht ganz wo das einzutragen ist, damit das hinter einem router funktioniert

Kommentar von ich am 02.06.2004 um 18:09

Einen kleinen Haken hat die Funktion allerdings noch: Wie kriege ich meine IP raus, wenn ich hinter einem Router sitze?

Kommentar von Olaf Vogel am 01.06.2004 um 09:12

der Tip von Johannes Roth ist toll. Hier mal die komplette
Funktion:

Function GetmyIP() As String
Dim WinSock
On Error Resume Next
Set WinSock = CreateObject("MSWinSock.WinSock")
GetmyIP = WinSock.LocalIP
End Function

Kommentar von Johannes Roth am 17.01.2004 um 19:10

Hat man nur eine Netzwerkkarte und verwendet die Winsock, dann kann man über

Winsock1.LocalIP

die eigene IP schnell ermitteln.

Kommentar von sk am 11.10.2001 um 18:19

Funktioniert auch unter VB4, muß jedoch ein klein wenig geändert werden!
- Private Function HostByName(Name$, Optional x% = 0) As String
ÄNDERN IN:
- Private Function HostByName(Name$, x%) As String