我有一个模仿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的网络。
根据以上所述,我应该
但是出于向后兼容的原因,我想保留我的预检检查,并且我还想继续使用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?