首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getaddrinfo with localhost:静态链接或不在同一系统上时的不同行为

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

Stack Overflow用户
提问于 2013-03-05 19:22:13
回答 1查看 529关注 0票数 3

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

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
#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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-08-13 10:03:03

在glibc系统下,通过getaddrinfo()实现RFC3484(IPv6中的地址选择/排序)是通过gai.conf文件实现的,如果存在,则该文件是这里的关键元素,因为这是正确的,并且对于动态链接库调用也是如此。

没有对静态链接库中的gai.conf进行系统调用的事实强烈地表明,无论如何在两个库之间都存在差异,并且它返回的唯一地址是IPv4地址的事实也是令人担忧的,因为RFC3484的实现规定返回的默认值是IPv6地址,我们知道该地址存在于运行动态链接库调用中。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15222510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档