【问题标题】:How gethostbyname() or getnameinfo() work in background?gethostbyname() 或 getnameinfo() 如何在后台工作?
【发布时间】: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
  1. 上述程序是否会在 Internet 中进行检查以解析为 IP?
  2. 为什么 www.google.com 显示的 IP 地址较少,而只显示 google.com 的 IP 地址更多?

【问题讨论】:

  • 你得到了什么输出?你期望的输出是什么?
  • @DragonX 它使用DNSvisual 解释 gethostbyname() 会做什么)。并且可能只有谷歌知道他们为什么为 google.com 和 www.google.com 配置不同地址的技术原因
  • 当你调用像gethostbyname这样的函数时,库只向一个或多个名称服务器(你的isp)发送请求,它可能会将请求转发到另一个名称服务器(例如google的),或者可能会返回一个缓存的回复,或者不同的东西。您看到的内容取决于名称服务器返回到库的内容。 Google 的名称服务器几乎可以肯定会进行负载平衡(即您不会每次都以相同的顺序获得相同的地址),并且它可能会执行其他一些对您来说并不明显的事情。不要打扰。
  • skarnet.org/software/s6-dns/getaddrinfo.html 的咆哮部分解决了您的问题,无论如何这很有趣 XD
  • @DragonX 正如咆哮者所说,在任何 sanely 配置的机器上,它基本上会尝试 /etc/hosts 然后使用 DNS;关键是 NSS 实际上总是使用 DNS,但严格来说它没有必须使用,而且这是一个复杂的混乱(参见 gerrit 的回答)

标签: c linux sockets


【解决方案1】:

在 Linux 系统上,glibc 中实现的 gethostbyname() 调用根据配置文件 /etc/host.conf/etc/nsswitch.conf 执行查找.

通常在默认配置中,如果给定名称的本地条目存在,它将首先在 /etc/hosts 文件中查找,如果存在,则返回该文件。否则,它将继续使用由 /etc/resolv.conf 配置的 DNS 协议,其中说明了名称服务器。

可以配置更复杂的设置来查找 LDAP 服务器、数据库等。

您还可以查看一些手册页,例如 man 5 nsswitch.conf

【讨论】:

    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多