getaddrinfo
不返回关于TTL的数据。。。因为它可能根本没有它,因为解析不一定是通过DNS完成的(可以是
hosts
文件、LDAP等。请参阅
/etc/nsswitch.conf
从其手册中可以看到返回的结构:
int getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res);
struct addrinfo {
int ai_flags; /* input flags */
int ai_family; /* protocol family for socket */
int ai_socktype; /* socket type */
int ai_protocol; /* protocol for socket */
socklen_t ai_addrlen; /* length of socket-address */
struct sockaddr *ai_addr; /* socket-address for socket */
char *ai_canonname; /* canonical name for service location */
struct addrinfo *ai_next; /* pointer to next in list */
};
在成功调用getaddrinfo()之后,*res是指向一个或多个addrinfo结构的链接列表的指针。
getaddrinfo
是否进行缓存,因为
getaddrinfo
一些特定的DNS API,比如
getdnsapi
会将TTL的一些信息反馈给呼叫者,请参见
https://getdnsapi.net/documentation/spec/
例6.2
此示例与上一个示例类似,只是它检索的信息比仅检索地址的信息多,因此它会遍历应答树。在本例中,它同时获取地址和它们的ttl。
在任何地方都没有任何缓存层,因为UDP是无状态的,所以
send
必须以某种方式或形式触发解决方案。
你说:
修改此代码以使用内部IP地址,而不是DNS名称
unbound
. 您的所有本地应用程序都将从中受益,以及更快的DNS解析(取决于
/etc/nsswitch.conf格式
,
/etc/resolv.conf
和
/etc/hosts
对于@Casper暗示的相关bug报告,其核心似乎更像是IPv6与IPv4之间的问题,可以通过调整
/etc/gai.conf
或者做一些更聪明的编程来打开连接,用所谓的“快乐眼球算法”来解决这两个问题
A
和
AAAA
同时,这意味着两个并行的DNS查询(因为您不能在每个协议中将它们组合成一个查询),并尝试使用返回最快的查询,稍微倾向于
如果你想在现代化的营地里这样你就可以
一个
在
抓住一个你根本得不到答复的案子
AAAA级
RFC6555
详细情况。