getaddrinfo()是一个函数,我们需要使用之前创建一个socket()或connect()ing,对吧?那么getaddrinfo如何与DNS服务器进行通信?getaddrinfo()如何执行DNS查找?
PS:我在哪里可以看到getaddrinfo的完整源代码?
getaddrinfo()是一个函数,我们需要使用之前创建一个socket()或connect()ing,对吧?那么getaddrinfo如何与DNS服务器进行通信?getaddrinfo()如何执行DNS查找?
PS:我在哪里可以看到getaddrinfo的完整源代码?
它使用DNS协议(UDP) http://www.freesoft.org/CIE/Topics/77.htm
False执行主机名到IP查找。见Steve Emmerson的回复。 – bortzmeyer 2010-01-30 17:26:07
它不?你能证明这个吗? – Zepplock 2010-02-02 06:21:21
您可以将您的nsswitch.conf更改为仅依赖/ etc/hosts,而不执行任何dns查找。 – 2014-05-04 10:24:29
简短的回答是“它要求系统”,这又知道怎么做DNS查询和服务器使用。
getaddrinfo()
由手册页getaddrinfo(3)
记录,这意味着它是一个C库函数。它也是一个POSIX函数,所以没有规范的“源”;符合POSIX的操作系统的每个标准C库都将实现它自己的版本。无论哪种方式,只有该函数的源代码可能不是太有启发性,因为它只会调用其他函数和操作系统API,并且您必须深入了解实际的DNS机制。如果你对如何工作感兴趣,你最好阅读DNS协议本身的文档。
这完全不正确。 UNIX操作系统没有内置的DNS查找功能。这是在标准库中的用户空间中完成的。 http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c – 2013-03-22 11:15:31
@HannesLandeholm我认为这里的细微差别在于,UNIX *内核*没有内置的DNS查找功能,但更一般意义上的“系统”包括随系统一起提供的用户空间服务。 – mtraceur 2017-10-19 20:16:38
getaddrinfo()
可能确实在幕后调用了connect()
,但它已经知道它需要连接到的DNS服务器的IP地址,以便查询您要求查询的主机的地址。
getaddrinfo()
如果要地图“www.somehost.com”的IP地址时,才需要,它是没有必要的作为底漆叫connect()
。
你也许可以找到在glibc的源getaddrinfo()
完整的源代码,你可以在这里找到(其他地方)。
希望能够为您澄清事物。
如果你想看看glibc如何命名查找,请从这里开始:http://cvs.savannah.gnu.org/viewvc/libc/resolv/nss_dns/dns-host.c?revision=1.57&root=libc&view=markup(注意:它**复杂**)。 – caf 2010-01-28 23:32:36
这是没有必要创建一个插座或连接之前调用getaddrinfo()
。它是用来像69.59.196.211将域名转换,像stackoverflow.com,一个IP地址。如果你知道IP地址,那么你可以直接连接到该地址,并且不需要使用getaddrinfo()
。 getaddrinfo()
使用DNS协议与您的名称服务器交谈,这些名称服务器使用其IP地址进行配置。
glibc的源代码是here。
你的Unix系统有文件/etc/nsswitch.conf吗?如果是这样,那么“主机”条目给出了将主机名解析为IP地址的搜索顺序。你的系统有文件/etc/resolv.conf吗?如果是这样,那么它指定要使用的DNS服务器。
正如你所看到的,getaddrinfo()将可以做相当多的(并且可能需要一段时间)!
对不起,如果这没有多大意义..开始学习unix网络编程只有几天回来 - 我很困惑。 – n00b2000 2010-01-28 20:07:54
在创建套接字之前或在调用connect()之前,不需要调用getaddrinfo()。 – 2010-01-28 20:16:47
connect()需要被告知目标主机的IP地址。为此,我们需要使用getaddrinfo() – 2015-02-24 08:12:49