[英]How does gcc/cygwin get the DNS server?
我有一些用cygwin(使用GCC)编写的代码,可以成功使用gethostbyname();。 但是,当我尝试直接使用解析器检索DNS服务器的IP地址时,它会失败(nsaddr_list []中的所有条目均为null,nscount为-1)。 如果gethostbyname()正在工作,则显然可以连接到DNS服务器。
此代码...
if (res_init() == -1) {
fprintf(stderr,"res_init() failed\n");
exit(1);
}
if (_res.nscount <= 0) {
fprintf(stderr,"nscount = %d\n",_res.nscount);
}
else {
for(i=0;i<_res.nscount;i++) {
fprintf(stderr, "dnssrvr: %d.%d.%d.%d\n",
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff) >> 0,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff00) >> 8,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff0000) >> 16,
(_res.nsaddr_list[i].sin_addr.s_addr & 0xff000000) >> 24);
}
}
在unix / linux上工作,但在cygwin上返回nscount = -1。 使用cygwin / gcc时是否有一些技巧可以获取DNS服务器?
res_init
不一定填充_res.nsaddr_list
。 而是在Windows上,它指示解析器使用DnsQuery_A
, 除非您具有resolv.conf
文件,在这种情况下,将使用该文件中的DNS服务器。
在此处查看源文件minires.c
和minires-os-if.c
。
如果您需要了解DNS服务器,则可能必须使用DnsQueryConfig
或GetNetworkParams
。
注意: _res
未记录,因此不应使用。
UPDATE 显然,“更新”(约2010及更高版本)的cygwin的版本做填入 _res.nsaddr_list
,通过调用get_dns_info
然后get_registry_dns
。您可能要确保拥有最新的cygwin,并且如果问题仍然存在,请尝试使用调试版本并跟踪对上述功能的调用。
更新2不, _res
未填充,我的错。
如nm所言 ,在Cygwin上,如果使用Windows解析程序,则res_init()
不会填充_res.nsaddr_list
。 如果/etc/resolv.conf
不存在,或/etc/resolv.conf
包含options osquery
,它将使用Windows解析器。
在我看来,这是一个Cygwin错误-返回负nscount
是伪造的-但尽管如此,我们仍坚持解决它。
解决方案是像Cygwin一样调用GetNetworkParams()
-这是我作为后备的做法:
#include <windows.h>
#include <iphlpapi.h>
#include <netinet/in.h>
#include <arpa/inet.h>
if (_res.nscount < 0)
{
ULONG buflen = 0;
FIXED_INFO *buf = NULL;
if (GetNetworkParams(NULL, &buflen) == ERROR_BUFFER_OVERFLOW)
buf = malloc(buflen);
if (buf && GetNetworkParams(buf, &buflen) == NO_ERROR)
{
_res.nscount = 1;
_res.nsaddr_list[0].sin_family = AF_INET;
_res.nsaddr_list[0].sin_addr.s_addr = inet_addr(buf->DnsServerList.IpAddress.String);
_res.nsaddr_list[0].sin_port = htons(53);
}
free(buf);
}
您需要针对GetNetworkParams()
函数针对-liphlpapi
进行链接。
这仅采用第一个Windows DNS地址,但是如果需要其余的Windows DNS地址,则可以遵循GetNetworkParams()
返回的链接列表。 GetNetworkParams()
仅返回IPv4地址,如果计算机配置了IPv6 DNS服务器地址,我不确定您应该怎么做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.