【发布时间】:2018-11-15 03:16:13
【问题描述】:
正如标题所说,我有想要使用指定 DNS 服务器解析的主机名(例如 www.example.com)。例如,在一种情况下,我想使用 google 的 IPv4 DNS,而在另一种情况下,我想使用 google 的 IPv6 DNS。
我已经在 iOS 上浏览了类似的东西,发现了类似的问题 (Swift - Get device's IP Address),所以我确信可以做到,但我不清楚如何做?
我该怎么做?
编辑 06/07/2018
@mdeora 建议的解决方案来自http://www.software7.com/blog/programmatically-query-specific-dns-servers-on-ios/
此解决方案有效,但前提是我使用 IPv4 DNS,例如 google 的“8.8.8.8”。如果我尝试使用 IPv6 DNS 2001:4860:4860::8888,我什么也得不到。
我已经设法改变转换:
void setup_dns_server(res_state res, const char *dns_server)
{
res_ninit(res);
struct in_addr addr;
// int returnValue = inet_aton(dns_server, &addr);
inet_pton(AF_INET6, dns_server, &addr); // for IPv6 conversion
res->nsaddr_list[0].sin_addr = addr;
res->nsaddr_list[0].sin_family = AF_INET;
res->nsaddr_list[0].sin_port = htons(NS_DEFAULTPORT);
res->nscount = 1;
};
但还是有这个问题:
void query_ip(res_state res, const char *host, char ip[])
{
u_char answer[NS_PACKETSZ];//NS_IN6ADDRSZ NS_PACKETSZ
int len = res_nquery(res, host, ns_c_in, ns_t_a, answer, sizeof(answer));
ns_msg handle;
ns_initparse(answer, len, &handle);
if(ns_msg_count(handle, ns_s_an) > 0) {
ns_rr rr;
if(ns_parserr(&handle, ns_s_an, 0, &rr) == 0) {
strcpy(ip, inet_ntoa(*(struct in_addr *)ns_rr_rdata(rr)));
}
}
}
len 得到 -1。从我收集的信息看来,我需要为 IPv6 配置 res_state。
【问题讨论】:
-
你的问题不是很清楚,能提供一个具体的例子吗?此外,DNS 不会将 URL 解析为 IP 地址,而是将主机名解析为 IP 地址。使用 IPv6 可用递归名称服务器在答案中是否有
AAAA记录的事实是分开的:您可以通过 IPv4 查询名称服务器并仍然返回AAAA记录。传输的内容与用于传输它的传输方式正交。 -
还有标签
ios、objective-c和swift在那里做什么?你没有提供任何你希望我们看到和讨论的代码,所以你在这里有点离题。请参阅 Webmasters、Super User 或 Server Fault。 -
让我澄清一点
-
这并不能解释为什么你特别想要 1) 首先是谷歌(它们远非唯一的公共 DNS 解析器,2)更重要的是,特别是在 IPv6 传输下?如果您感兴趣的区域发布一些
AAAA记录,您将获得它们用于查询递归名称服务器的任何 IP 版本。因此,您的问题仍然不清楚,您使用标签的原因也不清楚。否则,对于每个区域的特定 DNS“重定向”,请参阅dnsmasq。
标签: ios objective-c swift dns