我有一个iOS应用程序,利用内置套接字控件的库(换句话说,我不自己创建套接字,我只是通过套接字参数库)。我有两个API可以从库中获得,每个都包含一个IPv4或IPv6的可配置地址。然后,我可以配置一个切换,告诉图书馆是否应该使用IPv6或IPv4。iOS检测IPv6支持
这里是配置如何加载
// IPv6 Configuration
char* ipv6_addr = . . .; // This is defined elsewhere
config.server.s6.sin6_family = AF_INET6;
config.server.s6.sin6_port = htons(1122);
inet_pton(AF_INET6, ipv6_addr, &(config.server.s6.sin6_addr));
// IPv4 Configuration
char* ipv4_addr = . . .; // This is defined elsewhere
config.server.s4.sin_family = AF_INET;
config.server.s4.sin_port = htons(1122);
inet_pton(AF_INET, ipv4_addr, &(config.server.s4.sin_addr));
config.use_ipv6 = 1; // Set to 0 to use IPv4
我目前可以成功地连接到IPv4或IPv6根据一个示例什么设备和客户机网络(ISP等)的支持,但我必须手动配置use_ipv6标志。
我需要做的是检查客户端的网络(ISP等)是否支持IPv6。如果是这样,请使用IPv6连接。但是,如果没有,请使用IPv4连接。最好是这样的:config.use_ipv6 = has_ipv6_support();
其中函数has_ipv6_support()
返回1
或0
。
那么,我该如何去检查网络是否支持IPv6?
注
一)我不能使用,因为插座的图书馆内被处理的
getaddrinfo
常规方法,我不能使用主机名,由于我的基础设施基地转变IP的周围有很多。我只有一个IPv4地址或IPv6地址供我使用。 b)这是用C编写的,但我不介意Objective C中的解决方案。c)简单地测试一个IPv6连接是很困难的,因为我使用UDP进行连接,并且不得不超时响应。这比我想参与的逻辑要多一点,因为这需要每隔一段时间完成一次,我不想通过保持网络适配器的活性来杀死电池。我宁愿能够在本地获取这些信息。
通常最好的答案是“只是尝试使用IPv6,如果这不起作用就会快速回到IPv4”。这是一个选项吗?还记得你的应用程序需要从NAT64网关,因此在某些情况下仍需要将IPv4地址解析为NAT64 IPv6地址。 –
@SanderSteffann由于应用程序使用UDP协议,因此很难在响应没有超时的情况下测试连接。 –