3

我需要从我的应用程序中解析一些主机名。是否有任何替代 gethostbyname 的方法,我可以将我自己的 DNS 服务器作为参数作为解析器使用?

我已经编写了自己的函数,但我想可能有一个我不知道。

我正在使用 Linux/C 语言。我的 libc 是 uclibc。但我也对 GNU LibC 很好奇。

谢谢。

4

2 回答 2

5

您需要进行自己的查询,但这并不困难。

为此,您需要使用res_query()函数族,它允许您通过环境变量指定解析器:

res_init() 函数读取配置文件(请参阅 resolv.conf(5))以获取默认域名、搜索顺序和名称服务器地址。如果没有给定服务器,则尝试本地主机。如果没有给出域,则使用与本地主机关联的域。它可以被环境变量 LOCALDOMAIN 覆盖

IBM 的文档更深入地介绍了如何设置变量:

配置的搜索列表(struct state.defdname 和 struct state.dnsrch)可以通过将环境变量 LOCALDOMAIN 设置为最多 6 个搜索域的空格分隔列表,总共 256 个字符(包括空格)来覆盖。如果指定了搜索列表,则不会在查询中使用默认本地域。

备注 -

  • 您应该在打电话setenv()之前先打电话res_init(),否则设置将不会被接听。如果适用,请记住在完成后取消设置

  • 如果您对搜索域使用主机名,则/etc/hosts仍然优先。

  • res_init()2007年在 uclibc 中正确可重入,所以我很确定你可以将它用于任何目的。

这些函数还有一个额外的好处,就是能够检索更详细的数据(MX 等)。不过,如果你有一些更小的东西也能很好地工作,那么不使用它是没有意义的。

于 2012-10-26T07:39:05.960 回答
1

您可以更改默认 DNS 并使用您自己的 DNS 服务器,然后在应用程序中完成 DNS 服务后将其设置回原始 DNS。

  1. 首先查询 DNS 并保存旧的 DNS。

  2. 设置新的 DNS

  3. 做你的 DNS 服务

  4. 将原件放回原位

基本上上述所有步骤都是通过编辑完成的,/etc/resolv.conf这可以通过Linux 中的http://linux.die.net/man/3/resolver命令完成。

于 2012-10-26T07:37:35.740 回答