首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >socket()调用出错

socket()调用出错
EN

Stack Overflow用户
提问于 2012-03-08 22:54:38
回答 2查看 651关注 0票数 2

我想为我的程序添加IPv6支持,但遇到了奇怪的错误。我想打开接受连接的套接字。以下是我的场景:

首先,我使用getaddrinfo()来查找套接字配置:

代码语言:javascript
复制
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中生成非空结果。然后我想创建套接字:

代码语言:javascript
复制
socket(info->ai_family, info->ai_socktype, info->ai_protocol)

这里我得到了-1

代码语言:javascript
复制
strerror(errno)

返回Address family not supported by protocol

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-08 23:26:21

您需要向ai_flags添加AI_ADDRCONFIG,以确保它不会返回内核不支持的地址族。现在,我几乎总是添加这个旗帜。

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

票数 1
EN

Stack Overflow用户

发布于 2012-03-08 22:57:38

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9619582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档