我想为我的程序添加IPv6支持,但遇到了奇怪的错误。我想打开接受连接的套接字。以下是我的场景:
首先,我使用getaddrinfo()来查找套接字配置:
struct addrinfo hint, *info = NULL;
memset((void *)&hint, 0, sizeof(hint));
hint.ai_family = AF_INET6;
hint.ai_flags = AI_PASSIVE | AI_NUMERICSERV;
hint.ai_socktype = SOCK_STREAM;
if ((error = getaddrinfo(NULL, "1234", &hint, &info))) {
/* some error handling */
}I在info中生成非空结果。然后我想创建套接字:
socket(info->ai_family, info->ai_socktype, info->ai_protocol)这里我得到了-1
strerror(errno)返回Address family not supported by protocol
我认为getaddrinfo()只返回可以绑定的地址,在这种情况下,我希望它返回NULL。我遗漏了什么?
我想补充的是,我的eth0现在没有IPv6地址。我使用的是uClibc 0.9.32
发布于 2012-03-08 23:26:21
您需要向ai_flags添加AI_ADDRCONFIG,以确保它不会返回内核不支持的地址族。现在,我几乎总是添加这个旗帜。
如果你想在没有IPv6的情况下支持内核,你必须避免将ai_family设置为AF_INET6。相反,您必须侦听所有返回的地址,并确保在AF_INET6地址上设置IPV6_V6ONLY。不幸的是,不能保证首先返回AF_INET6地址。
发布于 2012-03-08 22:57:38
getaddrinfo返回struct addrinfo对象的链接列表,您可以使用ai_next成员遍历该列表。您应该依次尝试每个返回的addrinfo对象,直到您获得一个连接(或点击NULL/end of list)。
https://stackoverflow.com/questions/9619582
复制相似问题