gpt4 book ai didi

c - 使用本地主机 : different behaviour when statically linked or not on same system 获取地址信息

转载 作者:行者123 更新时间:2023-12-02 00:11:14 27 4
gpt4 key购买 nike

我有一个基本上调用 getaddrinfo 的小 C 程序。根据/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动态链接程序。

另一方面,在这种情况下静态链接是否意味着在链接时甚至评估配置文件??

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

测试.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);
}
}

最佳答案

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

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

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

关于c - 使用本地主机 : different behaviour when statically linked or not on same system 获取地址信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15222510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com