getaddrinfo()
是一个函数,我们需要使用before
创建一个套接字并连接(即,调用socket()
和connect()
)。getaddrinfo()
如何与DNS服务器通信?
在哪里可以看到getaddrinfo()
的完整源代码?
getaddrinfo()
是一个函数,我们需要使用before
创建一个套接字并连接(即,调用socket()
和connect()
)。getaddrinfo()
如何与DNS服务器通信?
在哪里可以看到getaddrinfo()
的完整源代码?
6条答案
按热度按时间hjzp0vay1#
简短的回答是“* 它会询问系统 *",而系统则知道如何进行DNS查找以及使用哪些服务器。
getaddrinfo()
由getaddrinfo(3)
手册页记录,这意味着它是一个C库函数。它也是一个POSIX函数,因此没有规范的“源代码”;符合POSIX的操作系统的每个标准C库将实现其自己的版本。无论哪种方式,该函数的源代码可能都不会太有启发性,因为它只会调用其他函数和OS API,并且您必须深入到实际的DNS机制。如果您对DNS协议的工作原理感兴趣,最好阅读DNS协议本身的文档。arknldoa2#
在创建套接字或连接之前,没有必要调用
getaddrinfo()
。它用于将域名(如stackoverflow.com)转换为IP地址(如69.59.196.211)。如果您知道IP地址,则可以直接连接到该地址,而无需使用getaddrinfo()
。getaddrinfo()
使用DNS协议与您的名称服务器进行通信,这些服务器使用其IP地址进行配置。glibc的源代码在这里。
lf3rwulv3#
你的Unix系统有/etc/nsswitch.conf文件吗?如果是,则“主机”条目给出将主机名解析为IP地址的搜索顺序。你的系统有/etc/resolv.conf文件吗?如果是,则指定要使用的DNS服务器。
正如你所看到的,getaddrinfo()可以做很多事情(可能需要一段时间)!
of1yzvn44#
getaddrinfo()
很可能在后台进行connect()
调用,但是它已经知道它需要连接到的DNS服务器的IP地址,以便查询您要求它查询的主机地址。getaddrinfo()
仅在您要将“* www.somehost.com *”Map到IP地址时才需要,它不需要作为调用connect()
的入门。您可能可以在glibc sources中找到
getaddrinfo()
的完整源代码,您可以在这里(以及其他地方)找到。希望这能为你澄清一些事情。
llew8vvj5#
getaddrinfo()
源代码在libc实现中:glibc和uclibc-ng使用
/etc/gai.conf
进行配置(glibc扩展,uclibc-ng尝试遵循glibc API)。musl有一些差异(例如,从
/etc/resolv.conf
中并行查询名称,并接受最先到达的响应,最多只支持3个名称服务器)。Android总是非常不同(像往常一样):它默认使用
/etc/ppp/resolv.conf
,但可以配置为使用/etc/resolv.conf
(通过注解掉-DANDROID_CHANGES
)。然而,检查旧的LineageOS,我没有看到这个文件。resolv_private.h
有更多的配置选项(例如:重试间隔5秒)。b4wnujal6#
它使用DNS协议(UDP)http://www.freesoft.org/CIE/Topics/77.htm