2

我的 Ubuntu Karmic 系统遇到了一个奇怪的问题。

当我使用 AI_PASSIVE 和 AF_UNSPEC 调用 getaddrinfo() 以获取空主机和 UDP 12000 端口以获取可绑定地址时,我只能返回一个 IPv4 结果(例如0.0.0.0:12000)。

如果我更改调用并指定 AF_INET6 而不是 AF_UNSPEC,则 getaddrinfo() 将返回“名称或服务未知”。

结果我不应该得到[::]:12000吗?

如果我将主机设置为::1也会发生同样的事情。

当我为主机“localhost”和 UDP 12000 端口调用不带 AI_PASSIVE 的 getaddrinfo() (以获取“可连接”地址)时,我首先得到[::1]:12000然后127.0.0.1:12000

显然,我的系统已准备好 IPv6(我可以 ping 到 IPv4 和 IPv6 地址,以及 DNS 解析)。但是,我怎么无法使用 getaddrinfo() 获得要绑定的 IPv6 地址?

你们有什么想法可能是错的吗?

我的操作系统是 Ubuntu Karmic,全新安装,无需任何网络调整。

谢谢你。

PS:如果您不知道但仍想帮助我,可以获取此示例程序或键入:

wget http://people.apache.org/~jorton/gai.c

并给我以下结果:

$ ./gai -ap null 12000

我的结果是:

$ ./gai -ap null 12000

getaddrinfo(NULL, "12000", {.family=AF_UNSPEC, .hints=0|AI_ADDRCONFIG|AI_PASSIVE}) = 0:

家庭= 2,原型= 6 inet4:地址= 0.0.0.0,端口= 12000

在那里你可以看到我只有一个 IPv4 结果。

4

1 回答 1

2

这发生在使用 eglibc: debian-glibc的新系统上。

显然,有一个错误要求您为您的网络接口之一设置至少一个有效的 IPv6 地址(环回不计算在内)。

在我这样做之后:

$ sudo ip -6 addr add 2001:660:4701:1001::1 dev eth0

我有:

$ ./gai -ap null 12000

getaddrinfo(NULL, "12000", {.family=AF_UNSPEC, .hints=0|AI_ADDRCONFIG|AI_PASSIVE}) = 0:

家庭= 2,原型= 6 inet4:地址= 0.0.0.0,端口= 12000

家庭=10,原型= 6 inet6:地址=::,端口=12000,流信息=0

我希望这可以帮助某人。

于 2010-03-27T12:39:59.360 回答