【发布时间】:2013-11-30 07:41:10
【问题描述】:
gethostbyname() 或 getnameinfo() 如何在后台工作?
#include <stdlib.h>
#include <stdio.h>
#include <netdb.h>
/* paddr: print the IP address in a standard decimal dotted format */
void
paddr(unsigned char *a)
{
printf("%d.%d.%d.%d\n", a[0], a[1], a[2], a[3]);
}
main(int argc, char **argv) {
struct hostent *hp;
char *host = "google.com";
int i;
hp = gethostbyname(host);
if (!hp) {
fprintf(stderr, "could not obtain address of %s\n", host);
return 0;
}
for (i=0; hp->h_addr_list[i] != 0; i++)
paddr((unsigned char*) hp->h_addr_list[i]);
exit(0);
}
google.com 的输出:
74.125.236.198
74.125.236.199
74.125.236.206
74.125.236.201
74.125.236.200
74.125.236.196
74.125.236.193
74.125.236.197
74.125.236.194
74.125.236.195
74.125.236.192
www.google.com 的输出:
74.125.236.210
74.125.236.209
74.125.236.212
74.125.236.208
74.125.236.211
- 上述程序是否会在 Internet 中进行检查以解析为 IP?
- 为什么 www.google.com 显示的 IP 地址较少,而只显示 google.com 的 IP 地址更多?
【问题讨论】:
-
你得到了什么输出?你期望的输出是什么?
-
当你调用像
gethostbyname这样的函数时,库只向一个或多个名称服务器(你的isp)发送请求,它可能会将请求转发到另一个名称服务器(例如google的),或者可能会返回一个缓存的回复,或者不同的东西。您看到的内容取决于名称服务器返回到库的内容。 Google 的名称服务器几乎可以肯定会进行负载平衡(即您不会每次都以相同的顺序获得相同的地址),并且它可能会执行其他一些对您来说并不明显的事情。不要打扰。 -
skarnet.org/software/s6-dns/getaddrinfo.html 的咆哮部分解决了您的问题,无论如何这很有趣 XD
-
@DragonX 正如咆哮者所说,在任何 sanely 配置的机器上,它基本上会尝试 /etc/hosts 然后使用 DNS;关键是 NSS 实际上总是使用 DNS,但严格来说它没有必须使用,而且这是一个复杂的混乱(参见 gerrit 的回答)