Ich habe Code, den ich unter cygwin schreibe (mit GCC), der erfolgreich gethostbyname () verwendet; Wenn ich jedoch versuche, den Resolver direkt zum Abrufen der IP-Adresse des DNS-Servers zu verwenden, schlägt er fehl (alle Einträge in nsaddr_list [] sind null und nsocount ist -1).
Wenn gethostbyname () funktioniert, ist es offensichtlich möglich, eine Verbindung zum DNS-Server herzustellen.
Dieser Code ...
funktioniert unter unix / linux, gibt aber nscount = -1 auf cygwin zurück. Gibt es einen Trick, den DNS-Server zu erhalten, wenn Sie cygwin / gcc benutzen?
Als n.m. sagt , auf Cygwin res_init()
füllt _res.nsaddr_list
nicht, wenn es den Windows-Resolver verwendet. Es verwendet den Windows-Resolver, wenn entweder /etc/resolv.conf
nicht existiert oder /etc/resolv.conf
enthält options osquery
.
Meiner Meinung nach handelt es sich hier um einen Cygwin-Bug - die Rückgabe eines negativen nscount
ist falsch - aber wir arbeiten trotzdem daran herum.
Die Lösung besteht darin, GetNetworkParams()
genau so aufzurufen, wie es Cygwin selbst tut - hier mache ich als Fallback:
Sie müssen mit -liphlpapi
für die Funktion GetNetworkParams()
verknüpfen.
Dies nimmt nur die erste Windows-DNS-Adresse, aber wenn Sie den Rest von ihnen wollen, können Sie der verknüpften Liste folgen, die GetNetworkParams()
zurückgibt. GetNetworkParams()
gibt nur IPv4-Adressen zurück. Ich bin mir nicht sicher, was Sie tun sollen, wenn der Computer eine IPv6-DNS-Serveradresse konfiguriert hat.
res_init
füllt nicht unbedingt _res.nsaddr_list
. Stattdessen wird der Resolver unter Windows angewiesen, DnsQuery_A
zu verwenden, es sei denn, haben Sie die Datei resolv.conf
. In diesem Fall werden DNS-Server aus dieser Datei verwendet.
Siehe die Quelle hier , Dateien minires.c
und minires-os-if.c
.
Wenn Sie Ihre DNS-Server kennen müssen, müssen Sie wahrscheinlich DnsQueryConfig
oder GetNetworkParams
verwenden.
Hinweis: _res
ist nicht dokumentiert und sollte nicht verwendet werden.
AKTUALISIEREN Anscheinend gibt die "neuere" Version (ca. 2010 und später) von cygwin _res.nsaddr_list
aus, über einen Aufruf von get_dns_info
und dann get_registry_dns
. Vielleicht möchten Sie sicherstellen, dass Sie das neueste cygwin haben, und wenn das Problem weiterhin besteht, versuchen Sie, eine Debug-Version zu verwenden und Aufrufe an die erwähnten Funktionen zu verfolgen.
UPDATE 2 Nein, _res
ist nicht gefüllt, mein Fehler.
Tags und Links c cygwin networking dns libresolv