2017-08-04 118 views
0

我有一个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()返回10

那么,我该如何去检查网络是否支持IPv6?

一)我不能使用,因为插座的图书馆内被处理的getaddrinfo常规方法,我不能使用主机名,由于我的基础设施基地转变IP的周围有很多。我只有一个IPv4地址或IPv6地址供我使用。 b)这是用C编写的,但我不介意Objective C中的解决方案。

c)简单地测试一个IPv6连接是很困难的,因为我使用UDP进行连接,并且不得不超时响应。这比我想参与的逻辑要多一点,因为这需要每隔一段时间完成一次,我不想通过保持网络适配器的活性来杀死电池。我宁愿能够在本地获取这些信息。

+1

通常最好的答案是“只是尝试使用IPv6,如果这不起作用就会快速回到IPv4”。这是一个选项吗?还记得你的应用程序需要从NAT64网关,因此在某些情况下仍需要将IPv4地址解析为NAT64 IPv6地址。 –

+0

@SanderSteffann由于应用程序使用UDP协议,因此很难在响应没有超时的情况下测试连接。 –

回答

0

作为UDP服务器,您的库应该同时监听IPv4和IPv6地址。因为绝对不可能知道哪些IPv4和IPv6可用,而没有定期尝试连接到使用IPv4和IPv6的远程主机。这是因为网络故障可能发生在网络中,仅在IPv6或IPv4路径的某处,可能发生在可能与您的应用程序交谈的远程端。所以,要么改变你的图书馆(但似乎不可能),或定期更换电池!对不起:-(