getaddrinfo()如何进行DNS查找?

n00*_*000 22 c unix networking

getaddrinfo()是我们创建socket()或connect()之前需要使用的函数,对吗?那么getaddrinfo首先如何与DNS服务器通信?

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

mar*_*k4o 10

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

glibc源代码在这里.

  • 使用`getnameinfo()`进行地址到名称的反向DNS查找. (3认同)

Tyl*_*nry 9

简短的回答是" 它询问系统 ",而后者又知道如何进行DNS查找以及使用哪些服务器.

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

  • @HannesLandeholm 我认为这里的细微差别是 UNIX *内核* 没有内置的 DNS 查找功能,但“系统”,从更一般的意义上来说,包括系统附带的用户空间服务。 (5认同)
  • 这完全是错误的.UNIX操作系统没有内置的DNS查找功能.这是在标准库中的用户空间中完成的.http://code.metager.de/source/xref/eglibc/libc/sysdeps/posix/getaddrinfo.c (2认同)

Ste*_*son 8

你的Unix系统是否有文件/etc/nsswitch.conf?如果是,则"hosts"条目给出将主机名解析为IP地址的搜索顺序.您的系统是否有/etc/resolv.conf文件?如果是,则指定要使用的DNS服务器.

正如你所看到的,getaddrinfo()可以做很多事情(可能需要一段时间)!