我可以选择DNS服务器替代gethostbyname吗?

时间:2012-10-26 07:22:22

标签: c linux networking dns uclibc

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

我已经编写了自己的功能,但我认为可能有一个我不知道的功能。

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

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

  

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

覆盖

IBM的docs更深入地了解如何来设置变量:

  

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

备注 -

  • 您应在致电setenv()之前致电res_init(),否则系统将无法接听。如果适用,请记得在完成后取消设置

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

  • res_init()made properly reentrant in uclibc in 2007,所以我很确定你可以将其用于任何目的。

这些功能还具有能够检索更详细数据(MX等)的额外好处。尽管如此,如果你有更小的东西同样有效,那么没有使用它是没有意义的。

答案 1 :(得分:1)

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

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

  2. 设置新DNS

  3. 执行您的DNS服务

  4. 设置原稿

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