VB 5/6-Tipp 0378: Eigene IPs schnell auslesen III
von ActiveVB
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: | Verwendete API-Aufrufe: 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: 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-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 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