gpt4 book ai didi

c - 来自 socket() 调用的错误

转载 作者:太空狗 更新时间:2023-10-29 12:36:45 24 4
gpt4 key购买 nike

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

我在 info 中生成非 NULL 结果。然后我想创建套接字:

socket(info->ai_family, info->ai_socktype, info->ai_protocol)

在这里我得到-1

strerror(errno)

返回协议(protocol)不支持的地址族

我认为 getaddrinfo() 只返回可以绑定(bind)的地址,我希望它在这种情况下返回 NULL。我错过了什么?

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

最佳答案

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

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

关于c - 来自 socket() 调用的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9619582/

24 4 0
文章推荐: html - alt 和标题未显示为 svg 路径的工具提示
文章推荐: javascript - jQuery:如何循环遍历具有数据属性的元素
文章推荐: javascript - 单击下拉菜单时如何隐藏默认