我的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,全新安装,没有任何网络调整。
谢谢。
P.S:如果你不知道但仍想帮助我,你可以得到sample program或输入:并告诉我结果:
$ ./gai -ap null 12000
我的结果是:
$ ./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
在那里你可以看到我只有一个IPv4结果。
答案 0 :(得分: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:
family = 2,proto = 6 inet4:addr = 0.0.0.0,port = 12000
family = 10,proto = 6 inet6:addr = ::, port = 12000,flowinfo = 0
我希望这可以帮助别人。