使用零IPv6地址

时间:2015-11-19 09:29:12

标签: ios ipv6 reachability

我有一个模仿Apple自己Reachability.m及其方法reachabilityForInternetConnection的库,可以像这样进行预检检查:

struct sockaddr_in zeroSockaddrin;
bzero(&zeroSockaddrin, sizeof(zeroSockaddrin));
zeroSockaddrin.sin_len = sizeof(zeroSockaddrin);
zeroSockaddrin.sin_family = AF_INET;

SCNetworkReachabilityRef networkReachabilityRef = SCNetworkReachabilityCreateWithAddress(allocator, (const struct sockaddr *)&zeroSockaddrin);

SCNetworkReachabilityFlags flags = 0;
SCNetworkReachabilityGetFlags(networkReachabilityRef, &flags);

现在,我正在努力遵守Apple的新指南,以支持仅支持IPv6的网络。

https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW25

根据以上所述,我应该

  • 避免预检网络可达性
  • 使用SCNetworkReachabilityCreateWithName而不是SCNetworkReachabilityCreateWithAddress。

但是出于向后兼容的原因,我想保留我的预检检查,并且我还想继续使用SCNetworkReachabilityCreateWithAddress来避免SCNetworkReachabilityCreateWithName的DNS查找引入的延迟。所以我只是将sockaddr_in更改为sockaddr_in6,如下所示:

struct sockaddr_in6 zeroSockaddrin;
bzero(&zeroSockaddrin, sizeof(zeroSockaddrin));
zeroSockaddrin.sin6_len = sizeof(zeroSockaddrin);
zeroSockaddrin.sin6_family = AF_INET6;

SCNetworkReachabilityRef networkReachabilityRef = SCNetworkReachabilityCreateWithAddress(allocator, (const struct sockaddr *)&zeroSockaddrin);

SCNetworkReachabilityFlags flags = 0;
SCNetworkReachabilityGetFlags(networkReachabilityRef, &flags);

如果我这样做,那么我只能获得0"标志"无论我的设备是否已通过4G或wifi连接。

我尝试用sockaddr_storage替换sockaddr_in6 - 结果相同。看起来我只能通过使用sockaddr_in或使用具有正确主机名的SCNetworkReachabilityCreateWithName获得有效的SCNetworkReachabilityFlags。

我有没有理由不能获得零IPv6地址的正确SCNetworkReachabilityFlags?

0 个答案:

没有答案