【发布时间】:2020-08-12 19:52:55
【问题描述】:
翻过一些旧的网络实用程序代码,我发现res_init() 在getipnodebyname() 之前调用:
void getAddresses(string hostname, set<string> &addresses) {
int error = 0;
res_init();
struct hostent *host = getipnodebyname(hostname.c_str(), AF_INET, AI_DEFAULT, &error);
insertHostAddresses(host, addresses);
freehostent(host);
}
我以前从未遇到过这个电话,我查阅了手册页:
https://linux.die.net/man/3/res_init
但是,这并没有完全帮助我理解何时需要进行此调用。
我知道这是为了预加载缓存?一点解释会帮助我。
我应该注意 - 当前调用 getaddrinfo 似乎不需要这个?
【问题讨论】:
-
对 - 这让我想知道为什么。我应该提一下,这个特定的代码被设计成可以在 linux 和 freebsd 之间移植。我最感兴趣的是 linux 方面。
-
您在哪里找到该代码?如果是某个公共程序,你能链接到它吗?
-
很遗憾没有。上面我写的代码作为总结。我会说 - Darwin 和 Freebsd 之间的实际示例区别在于,只有 Freebsd 称为
res_init() -
从您引用的手册页中:“res_init() 通常由第一次调用其他函数之一执行。”因此,即使您没有显式执行此操作,也可能会隐式调用它。 res_init() 负责读取 /etc/resolv.conf 并因此加载名称服务器列表以用于所有后续 DNS 请求。你可以在sourceware.org/git/?p=glibc.git;a=blob;f=resolv/…和sourceware.org/git/?p=glibc.git;a=blob;f=resolv/…看到它的源代码
标签: linux networking dns bsd