2

我想为我的程序添加 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 */
}

我生成非 NULL 结果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

4

2 回答 2

1

您需要添加AI_ADDRCONFIG到 ai_flags 以确保它不会返回内核不支持的地址系列。我现在几乎总是加上那个标志。

如果你想支持没有 IPv6 的内核,你必须避免将 ai_family 设置为 AF_INET6。相反,您必须监听所有返回的地址,并确保在 AF_INET6 上设置 IPV6_V6ONLY。不幸的是,不能保证首先返回 AF_INET6 地址。

于 2012-03-08T15:26:21.363 回答
0

getaddrinfo返回一个对象的链接列表,您可以使用该成员struct addrinfo对其进行遍历。ai_next您应该依次尝试每个返回addrinfo的对象,直到获得连接(或点击NULL/列表末尾)。

于 2012-03-08T14:57:38.223 回答