非阻塞DNS解析

时间:2016-04-17 20:53:15

标签: c sockets networking dns network-programming

这是在尝试构建DNS客户端/服务器系统时出现的问题......

(:SEQUENCE :START-ANCHOR (:GREEDY-REPETITION 0 NIL (:CHAR-CLASS #\ (:RANGE #\a #\z) (:RANGE #\A #\Z))) :END-ANCHOR) getaddrinfo等功能会采用某种DNS解析方式来回答查询。我已经挖掘了很多源代码,但实际上从未见过一行代码,其中套接字是打开的,并且在DNS服务器和客户端之间进行通信。

我的问题是,gethostbyname等函数如何在读取套接字等时执行网络操作(如DNS查找而不会阻塞)。从用户的角度来看,gethostbyname似乎在运作中几乎是即时的......

2 个答案:

答案 0 :(得分:2)

由于这些函数直接返回您要求的值(而不是使用回调或返回promise),并且由于DNS查找需要时间,因此这些函数必须明显阻止。它们的速度有多快取决于很多因素,例如它们查询的DNS服务器(本地或远程),结果是否已在DNS服务器中可用(即从先前的查找缓存)以及需要多快的上游DNS服务器查找未知名称。

答案 1 :(得分:0)

某些WA到异步解析是getaddrinfo_a使用GAI_NOWAIT选项。

glibc上的现有实现使用线程池来执行请求。而且,对于没有getaddrinfo_a支持的系统来说,实现这样的功能很简单。

请注意,解析机制不仅适用于DNS服务器,它还使用/etc/hosts(在Windows上:WINDIR/system32/etc/hosts)和其他来源,如mDNS等。它可以通过/etc/nsswitch.conf部分hosts:进行配置。

此功能由NSS子系统的“插件”提供,其中大多数可以通过前缀libnss_找到。 DNS解析器,AFAIK,位于我的系统上的libnss_dns.so/usr/lib/x86_64-linux-gnu/libnss_dns.so),由glibc(Linux Mint上的libc6包)提供。

因此,您应该查看插件实现以搜索网络操作。