我正在尝试编写一个同时侦听IPv6和IPv4连接的服务器应用程序。实现这一点的正确方法似乎是侦听IPv6地址,该地址也将接受IPv4连接。
相关的代码片段是:
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去做正确的事情,或者用一种不同的方法来实现我的目标。
发布于 2010-08-24 08:21:07
getaddrinfo()返回的地址顺序未指定,因此您必须准备好处理这两种情况。这可能意味着遍历列表,跟踪“目前为止最好的地址”。
或者,您可以尝试对getaddrinfo()返回的所有地址执行bind()和listen()操作。这可能是最好的选择,因为某些OSes不接受到侦听0::0的IPv6套接字的IPv4连接。
https://stackoverflow.com/questions/3552625
复制相似问题