Hi,
habe folgenden Code in einem Modul:
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 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 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
Public 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
Public 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
Public 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
Public 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 Durch den Aufruf mit:
Call InitSockets
Label1.Caption = HostByAddress(Text1.Text)
CleanSockets bekomme ich den DNS-Eintrag für die entsprechende IP.
Das geht auch rasend schnell, wenn ein Eintrag vorhanden ist.
Wähle ich jetzt aber eine IP (z.B. 213.168.102.30), wo es anscheinend kein Eintrag gibt, so dauert der Aufruf von HostByAddress sehr lange (4-5 Sekunden).
Meine Frage: Gibt es eine Möglichkeit nach 1 Sekunde
oder weniger die Nachfrage abzubrechen?
Ich habe es bereits mit einem Timer versucht, diese läuft aber nicht wie gedacht!!! Er läuft erst weiter, wenn die DNS-Anfrage vorbeit ist, obwohl der Timer (1000) bereits vor der Anfrage gestartet wurde.
Warum das Ganze? Das Prog soll später meine Log-Datei vom Server aufgesplittet in ein Listview schreiben und von jeder IP den DNS-Wert erstellen. Bei mehr als 100.000 Ips zieht sich das leider zu lange hin, wenn man bei einigen IPs immer 4-5 Sekunden warten muss. Weiß da keine andere Möglichkeit schnell zu schauen, ob überhaupt ein DNS-Eintrag vorliegt.
Über Vorschläge wäre ich wirklich dankbar!
Euer
Franz |