getaddrinfo with localhost:静态链接或不在同一系统上时的不同行为

时间:2013-03-05 11:22:13

标签: c getaddrinfo

我有一个小的c程序,基本上调用getaddrinfo。 根据/ etc / hosts,localhost可以解析为“127.0.0.1”和“:: 1”。

现在运行程序时,输出取决于我是否使用以下编译和链接:

gcc -static test.c
$ a.out
127.0.0.1 2

gcc test.c
$ a.out
::1 10
127.0.0.1 2

我正在检查哪些系统调用已经完成,而且似乎在第一种情况下没有使用配置文件/etc/gai.conf。但是我不希望gai.conf很重要,因为它几乎是空的(除了很多注释。)而且如果我删除文件,我仍然能够正确解析(根据/ etc / hosts)两个ips动态联系的计划。

另一方面静态链接在这种情况下意味着偶数配置文件在链接时评估

问题:为什么两个程序的输出都不同?

test.c:

#include <netdb.h>
#include <stdio.h>

int main(int argc, char *argv[]) {

    struct addrinfo *result, *rp;
    int s = getaddrinfo("localhost", "", NULL, &result);
    char host[INET6_ADDRSTRLEN];
    for (rp = result; rp != NULL ; rp = rp->ai_next) {
        inet_ntop(rp->ai_family,
        (rp->ai_family == AF_INET ?
            &(((struct sockaddr_in*)rp->ai_addr)->sin_addr): 
                &(((struct sockaddr_in6*)rp->ai_addr)->sin6_addr)),
                host, sizeof host);
        printf("%s %d\n", host, rp->ai_family);
    }
}

1 个答案:

答案 0 :(得分:3)

在glibc系统下,通过getaddrinfo()执行RFC 3484(IPv6中的地址选择/排序)是通过gai.conf文件执行的,如果存在,这是关键元素,因为这是正确的,因为它应该是动态链接的库调用。

静态链接库中没有对gai.conf进行系统调用这一事实强烈表明两个库之间存在差异,并且它返回的唯一地址是IPv4地址也是因为RFC 3484的实现声明返回的默认值是IPv6地址,我们知道这些地址是通过运行动态链接库调用而存在的。

如果不访问您的系统,我会说这里存在库文件错误,而不是编码错误。