Wie erhält gcc / cygwin den DNS-Server?

8

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 ...

%Vor%

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?

    
Ed. 09.05.2012, 20:44
quelle

2 Antworten

2

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:

%Vor%

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.

    
caf 01.06.2012, 03:25
quelle
3

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.

    
n.m. 27.05.2012 10:32
quelle

Tags und Links