getaddrinfo()是我们在创建socket()或connect()之前需要使用的函数,对吗?那么getaddrinfo首先如何与DNS服务器通信?
PS:我在哪里可以看到getaddrinfo的完整来源?
答案 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地址,以便查询您所在主机的地址要求它查询。
getaddrinfo()
,而不需要将其作为引用来调用connect()
。< / p>
您可以在glibc源中找到getaddrinfo()
的完整源代码,您可以在这里找到(在其他地方)。
希望能为你澄清事情。
答案 4 :(得分:-1)
使用DNS协议(UDP) http://www.freesoft.org/CIE/Topics/77.htm