C 套接字()调用出错

C 套接字()调用出错,c,linux,sockets,uclibc,C,Linux,Sockets,Uclibc,我想为我的程序添加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 =

我想为我的程序添加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 gen在
info
中生成非空结果。然后我要创建套接字:

socket(info->ai_family, info->ai_socktype, info->ai_protocol)
这里我得到了
-1

strerror(errno)
返回协议不支持的
地址系列

我认为
getaddrinfo()
只返回可以绑定的地址,在本例中我希望它返回NULL。我错过了什么


我想补充一点,我的eth0现在没有IPv6地址。我正在使用uClibc 0.9.32

getaddrinfo
返回
struct addrinfo
对象的链接列表,您可以使用
ai\u next
成员遍历这些对象。您应该依次尝试每个返回的
addrinfo
对象,直到获得连接(或点击
NULL
/end of list)。

您需要将
AI\u ADDRCONFIG
添加到AI\u标志中,以确保它不会返回内核不支持的地址族。我现在几乎总是加上那面旗帜


如果您想支持没有IPv6的内核,您必须避免将ai_系列设置为AF_INET6。相反,您必须监听所有返回的地址,并确保仅在AF_INET6地址上设置IPV6。遗憾的是,无法保证首先返回AF_INET6地址。

您得到了您想要的。。。否则删除
hint.ai_family=AF_INET6AF_INET6
传递给getaddrinfo。如果该套接字调用或以下套接字调用失败,我将返回到
AF\u INET
。它的代码更多,但拥有一个侦听套接字可以使其他地方的工作更轻松(确保只有在这样做的情况下才关闭IPV6_v6)。