iOS检测IPv6支持

时间:2017-08-04 22:29:16

标签: ios c ipv6

我有一个iOS应用程序,它使用带有内置套接字控件的库(换句话说,我自己不创建套接字,我只是将库的参数传递给套接字)。我从库中可以使用两个API,每个API都包含一个可配置的地址,可以是IPv4或IPv6。然后有一个切换我可以配置告诉库是否应该使用IPv6或IPv4。

以下是配置加载方式的示例

// 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?

  

注释

     

a)我不能使用getaddrinfo的常规方法,因为套接字是在库内部处理的,由于我的基础设施基础转移IP很多,我无法使用主机名。我只有IPv4地址或IPv6地址。

     

b)这是用C语言编写的,但我也不介意在Objective C中使用解决方案。

     

c)由于我使用UDP进行连接并且必须在响应上超时,因此很难简单地测试IPv6连接。这比我想参与的逻辑要多一些,因为这需要时不时地完成,我不想通过保持网络适配器活着来杀死电池。我更愿意在本地提取这些信息。

1 个答案:

答案 0 :(得分:0)

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