【问题标题】:When should I call res_init in linux?我什么时候应该在 linux 中调用 res_init?
【发布时间】: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


【解决方案1】:

如果打算在使用任何其他 resolver(3) 函数(直接或间接)之前修改任何内部解析器设置,则必须调用 res_init(),例如更改_res.options 中设置的标志。

【讨论】:

  • 您写这篇文章似乎是为了回答问题的标题而没有阅读其正文。
  • 如果您还阅读了原发帖者关于问题的所有cmets,您可能会更好地理解我的答案形式?
  • 我写了一半的 cmets。
  • cmets ... 由原始发布者
  • 你是说你认为我没有阅读他们就以某种方式回复了 OP 的 cmets?
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
相关资源
最近更新 更多