我需要从我的应用程序中解析一些主机名。有没有gethostbyname的替代方法,我可以作为参数提供我自己的DNS服务器用作解析器?
我已经编写了自己的功能,但我认为可能有一个我不知道的功能。
我使用的是Linux / C语言。我的libc是uclibc。但我也对GNU LibC感到好奇。
感谢。
答案 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。
首先查询DNS并保存旧DNS。
设置新DNS
执行您的DNS服务
设置原稿
基本上所有上述步骤都是通过编辑/etc/resolv.conf
来完成的,这可以通过Linux中的http://linux.die.net/man/3/resolver命令完成。