C语言 getaddrinfo()如何执行DNS查找?

pvabu6sv  于 2023-10-16  发布在  其他
关注(0)|答案(6)|浏览(180)

getaddrinfo()是一个函数,我们需要使用before创建一个套接字并连接(即,调用socket()connect())。getaddrinfo()如何与DNS服务器通信?
在哪里可以看到getaddrinfo()的完整源代码?

hjzp0vay

hjzp0vay1#

简短的回答是“* 它会询问系统 *",而系统则知道如何进行DNS查找以及使用哪些服务器。
getaddrinfo()getaddrinfo(3)手册页记录,这意味着它是一个C库函数。它也是一个POSIX函数,因此没有规范的“源代码”;符合POSIX的操作系统的每个标准C库将实现其自己的版本。无论哪种方式,该函数的源代码可能都不会太有启发性,因为它只会调用其他函数和OS API,并且您必须深入到实际的DNS机制。如果您对DNS协议的工作原理感兴趣,最好阅读DNS协议本身的文档。

arknldoa

arknldoa2#

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

lf3rwulv

lf3rwulv3#

你的Unix系统有/etc/nsswitch.conf文件吗?如果是,则“主机”条目给出将主机名解析为IP地址的搜索顺序。你的系统有/etc/resolv.conf文件吗?如果是,则指定要使用的DNS服务器。
正如你所看到的,getaddrinfo()可以做很多事情(可能需要一段时间)!

of1yzvn4

of1yzvn44#

getaddrinfo()很可能在后台进行connect()调用,但是它已经知道它需要连接到的DNS服务器的IP地址,以便查询您要求它查询的主机地址。
getaddrinfo()仅在您要将“* www.somehost.com *”Map到IP地址时才需要,它不需要作为调用connect()的入门。
您可能可以在glibc sources中找到getaddrinfo()的完整源代码,您可以在这里(以及其他地方)找到。
希望这能为你澄清一些事情。

llew8vvj

llew8vvj5#

getaddrinfo()源代码在libc实现中:

  • musl(如预期的那样,源代码可读性很好)
  • glibc(如预期膨胀)
  • uclibc-ng(复制自glibc)
  • 仿生(Android专用)

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秒)。

相关问题