首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确保服务器在可能的情况下侦听IPv6,否则侦听IPv4?

如何确保服务器在可能的情况下侦听IPv6,否则侦听IPv4?
EN

Stack Overflow用户
提问于 2010-08-24 08:08:27
回答 2查看 2.6K关注 0票数 3

我正在尝试编写一个同时侦听IPv6和IPv4连接的服务器应用程序。实现这一点的正确方法似乎是侦听IPv6地址,该地址也将接受IPv4连接。

相关的代码片段是:

代码语言:javascript
复制
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(NULL, MYPORT, &hints, &res);

(几乎是从Beej's Guide复制过来的)

问题是,至少在我的系统上,getaddrinfo首先返回AF_INET,然后返回AF_INET6 --而根据规范,客户机的getaddrinfo首先返回AF_INET6。在我幼稚的方法中,服务器选择IPv4,客户端选择IPv6,连接失败。

我试图通过设置hints.ai_family = AF_INET6来解决这个问题,但在IPv6不可用的系统上失败了。

我看到了两个显而易见的解决方案:

a)尝试先请求IPv6,如果请求失败,则返回到IPv4,或者

b)遍历getaddrinfo的结果,查找IPv6,如果不存在,则选择第一个条目

但我不太喜欢其中任何一个;)我觉得应该有一种方法来说服getaddrinfo去做正确的事情,或者用一种不同的方法来实现我的目标。

EN

Stack Overflow用户

回答已采纳

发布于 2010-08-24 08:21:07

getaddrinfo()返回的地址顺序未指定,因此您必须准备好处理这两种情况。这可能意味着遍历列表,跟踪“目前为止最好的地址”。

或者,您可以尝试对getaddrinfo()返回的所有地址执行bind()listen()操作。这可能是最好的选择,因为某些OSes不接受到侦听0::0的IPv6套接字的IPv4连接。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3552625

复制
相关文章

相似问题

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