这是在尝试构建DNS客户端/服务器系统时出现的问题......
(:SEQUENCE
:START-ANCHOR
(:GREEDY-REPETITION 0
NIL
(:CHAR-CLASS #\
(:RANGE #\a #\z)
(:RANGE #\A #\Z)))
:END-ANCHOR)
或getaddrinfo
等功能会采用某种DNS解析方式来回答查询。我已经挖掘了很多源代码,但实际上从未见过一行代码,其中套接字是打开的,并且在DNS服务器和客户端之间进行通信。
我的问题是,gethostbyname
等函数如何在读取套接字等时执行网络操作(如DNS查找而不会阻塞)。从用户的角度来看,gethostbyname
似乎在运作中几乎是即时的......
答案 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
包)提供。
因此,您应该查看插件实现以搜索网络操作。