正如标题所示,我有一个主机名(例如www.example.com),我想使用指定的DNS服务器解析它。例如,在某些情况下,我想使用Google的IPv4 DNS,在另一种情况下,我想使用Google的IPv6 DNS。
我在SO上搜索了iOS上类似的内容,并找到了像这样的问题(Swift-获取设备的IP地址),所以我确定可以做到,但我不清楚如何做?
我该如何做?
编辑06/07/2018
@mdeora建议从http://www.software7.com/blog/programmatically-query-specific-dns-servers-on-ios/查询特定DNS服务器的解决方案。
这个解决方案有效,但只适用于我使用IPv4 DNS,例如Google的“8.8.8.8”。如果我尝试使用IPv6 DNS 2001:4860:4860 :: 8888,则什么都没有。
我已经成功更改转换:
但仍然有困难:
我在SO上搜索了iOS上类似的内容,并找到了像这样的问题(Swift-获取设备的IP地址),所以我确定可以做到,但我不清楚如何做?
我该如何做?
编辑06/07/2018
@mdeora建议从http://www.software7.com/blog/programmatically-query-specific-dns-servers-on-ios/查询特定DNS服务器的解决方案。
这个解决方案有效,但只适用于我使用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。
AAAA
记录在答案中是分开的:您可以通过 IPv4 查询名称服务器并仍然返回AAAA
记录。传输的内容与用于传输它的传输方式正交。 - Patrick Mevzekios
、objective-c
和swift
是做什么的呢?你没有提供任何代码片段让我们查看和讨论,所以你有点离题了。请参见[Webmasters.se]、[su]或[sf]。 - Patrick Mevzekdnsmasq
。 - Patrick Mevzek