无法绑定到 IPv6 地址

发布于 2024-08-26 09:21:52 字数 1374 浏览 14 评论 0原文

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

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

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

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

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

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

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

你们知道可能出了什么问题吗?

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

谢谢。

PS:如果你不知道但仍然想帮助我,你可以得到这个示例程序< /a> 或输入:

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

并给我结果:

$ ./gai -ap null 12000

我的结果是:

$ ./gai -ap null 12000

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

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

您可以看到我只有一个 IPv4 结果。

I am facing a strange problem on my Ubuntu Karmic system.

When I call getaddrinfo() with AI_PASSIVE and AF_UNSPEC, for an empty host and the UDP 12000 port to get a bindable address, I only get back one IPv4 result (0.0.0.0:12000 for instance).

If I change my call and specify AF_INET6 instead of AF_UNSPEC, then getaddrinfo() returns "Name or service not known".

Shouldn't I get [::]:12000 as a result ?

The same thing happens if I set the host to ::1.

When I call getaddrinfo() without AI_PASSIVE (to get a "connectable" address) for the host "localhost" and the UDP 12000 port, I first get [::1]:12000 then 127.0.0.1:12000.

So apparently, my system is IPv6 ready (I can ping to both IPv4 and IPv6 addresses, as well as DNS resolution). But how is it that I can't get an IPv6 address to bind to with getaddrinfo() ?

Do you guys have any idea about what could be wrong ?

My OS is Ubuntu Karmic, fresh install without any networking tweaking.

Thank you.

P.S: If you have no idea but still want to help me, you can get this sample program or type:

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

And give me the result of:

$ ./gai -ap null 12000

My result is:

$ ./gai -ap null 12000

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

family= 2, proto= 6 inet4: addr=0.0.0.0, port=12000

There you can see that I only have one IPv4 result.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

送你一个梦 2024-09-02 09:21:52

这种情况发生在使用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:addr=0.0.0.0,端口=12000

family=10,proto=6 inet6:addr=::,端口=12000,flowinfo=0

我希望这可以帮助别人。

This happens on new systems that use eglibc: debian-glibc.

Apparently, there is a bug that requires you to set at least one valid IPv6 address to one of your network interfaces (the loopback doesn't count).

After I did this:

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

I have:

$ ./gai -ap null 12000

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

family= 2, proto= 6 inet4: addr=0.0.0.0, port=12000

family=10, proto= 6 inet6: addr=::, port=12000, flowinfo=0

I hope this can help someone.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文