Liebe Mit-VB-Programmierer,
ich habe ein Problem, bei dem ich nicht weiterkomme, auch die Internet-Recherche war leider nicht zielführend. Daher wende ich mich an Euch in der Hoffnung, das vielleicht jemand eine Idee oder einen Hinweis zu meinem Problem hat.
Es geht darum, dass ich für eine gegebene IP-Adresse den Hostnamen ermitteln möchte.
Das an sich funktioniert auch sehr gut mit folgendem API-Aufruf
Private Declare Function gethostbyaddr Lib "wsock32.dll" (haddr As Long, ByVal _
hnlen As Long, ByVal addrtype As Long) As Long Der Nachteil dieses Aufrufs ist aber, dass er sehr lange dauert, wenn es für eine IP-Adresse keinen Hostnamen gibt.
Deswegen habe ich mich nach Alternativen umgeschaut und bin bei meiner Suche auf folgenden API-Aufruf gestoßen:
Private Declare Function getnameinfo Lib "WS2_32" (addr As Any, ByVal iLen As _
Long, ByRef host As String, ByVal HostLen As Long, ByRef serv As String, _
ByVal servlen As Long, ByVal Flags As Long) As Long Beim Versuch, mit Hilfe dieser API-Funktion beispielsweise den Hostnamen der IP-Adresse 209.85.129.147 (das ist die IP-Adresse von www.google.de) zu ermitteln, bin ich jedoch kläglich gescheitert. Der Return-Code des API-Aufrufs ist stets 11004.
Laut meiner Recherche bedeutet dieser Code "WSANO_DATA", was - wenn ich das richtig verstanden habe - bedeutet, dass mein Aufruf an sich korrekt war, es aber für die abgefragte IP-Adresse keine Daten gibt.
Ich hab schon so ziemlich alles ausprobiert, hab verschiedene Ports angegeben (und auch auf die richtige Byte-Reihenfolge via htons geachtet) und mit dem Flags-Parameter herumgespielt. Ich hab mal die Hostname-Variable als festen String (String * 1025) oder als normalen String definiert und ihm im letzteren Fall vor dem API-Aufruf per String$(1025) entsprechenden Speicherplatz zugewiesen.
Und selbstverständlich habe ich es mit einem ganzen Haufen unterschiedlicher IP-Adressen (für die es Hostnamen gibt) ausprobiert.
Immer und grundsätzlich hatte der Return-Code den Wert 11004!
Was mache ich falsch?
Mache ich vielleicht einen grundsätzlichen Denkfehler?
Gibt es sonstige Alternativen?
Oder: Weiß vielleicht jemand, wie ich gethostbyaddr im Falle eines nichtvorhandenen Hostnamens schneller machen kann - vielleicht mit Hilfe eines wie auch immer gearteten Timeouts?
Der Aufruf von WSAAsyncGetHostByAddr wäre keine Alternative, da ich in dem Umfeld, in dem ich die Abfrage starte, keine asynchronen Strukturen aufbauen kann.
Für jegliche Art der Hilfestellung wäre ich enorm dankbar!
Manfred |