2010-01-28 62 views
16

getaddrinfo()是一个函数,我们需要使用之前创建一个socket()或connect()ing,对吧?那么getaddrinfo如何与DNS服务器进行通信?getaddrinfo()如何执行DNS查找?

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

+0

对不起,如果这没有多大意义..开始学习unix网络编程只有几天回来 - 我很困惑。 – n00b2000 2010-01-28 20:07:54

+0

在创建套接字之前或在调用connect()之前,不需要调用getaddrinfo()。 – 2010-01-28 20:16:47

+0

connect()需要被告知目标主机的IP地址。为此,我们需要使用getaddrinfo() – 2015-02-24 08:12:49

回答

-1

它使用DNS协议(UDP) http://www.freesoft.org/CIE/Topics/77.htm

+1

False执行主机名到IP查找。见Steve Emmerson的回复。 – bortzmeyer 2010-01-30 17:26:07

+0

它不?你能证明这个吗? – Zepplock 2010-02-02 06:21:21

+0

您可以将您的nsswitch.conf更改为仅依赖/ etc/hosts,而不执行任何dns查找。 – 2014-05-04 10:24:29

4

简短的回答是“它要求系统”,这又知道怎么做DNS查询和服务器使用。

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

+2

这完全不正确。 UNIX操作系统没有内置的DNS查找功能。这是在标准库中的用户空间中完成的。 http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c – 2013-03-22 11:15:31

+0

@HannesLandeholm我认为这里的细微差别在于,UNIX *内核*没有内置的DNS查找功能,但更一般意义上的“系统”包括随系统一起提供的用户空间服务。 – mtraceur 2017-10-19 20:16:38

1

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

getaddrinfo()如果要地图“www.somehost.com”的IP地址时,才需要,它是没有必要的作为底漆叫connect()

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

希望能够为您澄清事物。

+2

如果你想看看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

10

这是没有必要创建一个插座或连接之前调用getaddrinfo()。它是用来像69.59.196.211将域名转换,像stackoverflow.com,一个IP地址。如果你知道IP地址,那么你可以直接连接到该地址,并且不需要使用getaddrinfo()getaddrinfo()使用DNS协议与您的名称服务器交谈,这些名称服务器使用其IP地址进行配置。

glibc的源代码是here

+0

告诉我一件事,如果我想做反向DNS查询,那么哪个系统调用需要? – devsda 2013-03-01 09:15:00

+2

使用'getnameinfo()'进行地址到名称反向DNS查询。 – mark4o 2013-03-01 19:04:35

7

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

正如你所看到的,getaddrinfo()将可以做相当多的(并且可能需要一段时间)!