无法绑定到 IPv6 地址
我的 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:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这种情况发生在使用eglibc的新系统上: debian-glibc。
显然,存在一个错误,要求您为网络接口之一设置至少一个有效的 IPv6 地址(环回不计在内)。
我这样做之后:
我有:
我希望这可以帮助别人。
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:
I have:
I hope this can help someone.