我需要从我的应用程序中解析一些主机名。是否有任何替代 gethostbyname 的方法,我可以将我自己的 DNS 服务器作为参数作为解析器使用?
我已经编写了自己的函数,但我想可能有一个我不知道。
我正在使用 Linux/C 语言。我的 libc 是 uclibc。但我也对 GNU LibC 很好奇。
谢谢。
我需要从我的应用程序中解析一些主机名。是否有任何替代 gethostbyname 的方法,我可以将我自己的 DNS 服务器作为参数作为解析器使用?
我已经编写了自己的函数,但我想可能有一个我不知道。
我正在使用 Linux/C 语言。我的 libc 是 uclibc。但我也对 GNU LibC 很好奇。
谢谢。
您需要进行自己的查询,但这并不困难。
为此,您需要使用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 等)。不过,如果你有一些更小的东西也能很好地工作,那么不使用它是没有意义的。
您可以更改默认 DNS 并使用您自己的 DNS 服务器,然后在应用程序中完成 DNS 服务后将其设置回原始 DNS。
首先查询 DNS 并保存旧的 DNS。
设置新的 DNS
做你的 DNS 服务
将原件放回原位
基本上上述所有步骤都是通过编辑完成的,/etc/resolv.conf
这可以通过Linux 中的http://linux.die.net/man/3/resolver命令完成。