getaddrinfo()如何进行DNS查找?

时间:2010-01-28 20:05:57

标签: c unix networking

getaddrinfo()是我们在创建socket()或connect()之前需要使用的函数,对吗?那么getaddrinfo首先如何与DNS服务器通信?

PS:我在哪里可以看到getaddrinfo的完整来源?

5 个答案:

答案 0 :(得分:10)

在创建套接字或连接之前,无需调用getaddrinfo()。它用于将域名(如 stackoverflow.com )转换为 69.59.196.211 等IP地址。如果您知道IP地址,那么您可以直接连接到该地址,而无需使用getaddrinfo()getaddrinfo()使用DNS协议与您的名称服务器通信,这些名称服务器使用其IP地址进行配置。

glibc源代码是here

答案 1 :(得分:8)

您的Unix系统是否有文件/etc/nsswitch.conf?如果是,则“hosts”条目给出将主机名解析为IP地址的搜索顺序。您的系统是否有/etc/resolv.conf文件?如果是,则指定要使用的DNS服务器。

正如您所看到的,getaddrinfo()可以做很多事情(可能需要一段时间)!

答案 2 :(得分:6)

简短的回答是“它询问系统”,后者又知道如何进行DNS查找以及使用哪些服务器。

getaddrinfo()getaddrinfo(3)手册页记录,这意味着它是一个C库函数。它也是一个 POSIX 函数,因此没有规范的“源”;符合POSIX的操作系统的每个标准C库都将实现自己的版本。无论哪种方式,只是该功能的源可能不太有启发性,因为它只会调用其他函数和OS API,并且您必须向下钻取到达实际的DNS机制。如果您对如何工作感兴趣,最好阅读DNS协议本身的文档。

答案 3 :(得分:1)

getaddrinfo()可能会在幕后进行connect()调用,但是它已经知道它需要连接的DNS服务器的IP地址,以便查询您所在主机的地址要求它查询。

仅当您想要将“ www.somehost.com ”映射到IP地址时才需要

getaddrinfo(),而不需要将其作为引用来调用connect()。< / p>

您可以在glibc源中找到getaddrinfo()的完整源代码,您可以在这里找到(在其他地方)。

希望能为你澄清事情。

答案 4 :(得分:-1)