首页 文章

iOS检测IPv6支持

提问于
浏览
0

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

Here is an example of how the configuration is loaded

// 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标志 .

What I need to do is check if the client's network (ISP, etc) supports IPv6. If so, use an IPv6 connection. But if not, use an IPv4 connection. Preferably something like this: config.use_ipv6 = has_ipv6_support(); in which the function has_ipv6_support() returns either a 1 or 0.

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

注意a)我不能使用getaddrinfo的常规方法,因为套接字是在库内处理的,我不能使用主机名,因为我的基础设施基础转移IP很多 . 我只有IPv4地址或IPv6地址 . b)这是用C语言编写的,但我也不介意在Objective C中使用解决方案 . c)由于我使用UDP进行连接并且必须在响应上超时,因此很难简单地测试IPv6连接 . 这比我想参与的逻辑要多一些,因为这需要时不时地完成,我不想通过保持网络适配器活着来杀死电池 . 我希望能够在本地提取这些信息 .

1 回答

  • 0

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

相关问题