24789


ipv6検証をするために[ios Developer CenterのTest for IPv6 DNS64/NAT64 Compatibility
Regularly](https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)を参考にipv6環境をmacに作りました。

[Qiita](http://qiita.com/yonell/items/16c08e541b4a2b84b0a3)でも同様のやり方が書かれていました。

そして、以下のコードで検証しようとしました。

[code]

    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    [reachability startNotifier];
    
[/code]

以下が該当の[Reachabilityのソース](https://github.com/tonymillion/Reachability/blob/master/Reachability.m#L122)です。

[code]

    +(instancetype)reachabilityForInternetConnection {
      struct sockaddr_in zeroAddress;
      bzero(&zeroAddress, sizeof(zeroAddress));
      zeroAddress.sin_len = sizeof(zeroAddress);
      zeroAddress.sin_family = AF_INET;
    
      return [self reachabilityWithAddress:&zeroAddress];
    }
    
    +(instancetype)reachabilityWithAddress:(void *)hostAddress {
       SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);
    
       if (ref) 
        {
         id reachability = [[self alloc] initWithReachabilityRef:ref];
         return reachability;
        }
    
       return nil;
    }    
    
[/code]

sockaddr_inはipv4用なので動作しないはずと考えていましたが、ios9.3.1で動作させたところ、普通に動作してしまいました。  
(参考までに[AFNetworking](https://github.com/AFNetworking/AFNetworking/pull/3174/files)のipv6対応を見ると
`sockaddr_in6` に変えていていました。)

なぜ動作してしまうのか、教えていただけると幸いです。


CC BY-SA 3.0
2016-05-12T03:00:15.333
24771
2016-05-13T07:42:32.833
2016-05-12T08:44:17.037
670
670
question
ios ipv6
macでipv6環境を作成して、iosでsockaddr_inを利用しても動作してしまう


推測ですが、AppleのReachabilityのサンプルソースのReadme  
<https://developer.apple.com/library/ios/samplecode/Reachability/Listings/ReadMe_md.html>  
には、

> IPv6 Support
>
> Reachability fully supports IPv6. More specifically, each of the APIs
> >handles IPv6 in the following way:
>
> reachabilityForInternetConnection
>
> This monitors the address 0.0.0.0, which reachability treats as a >special
> token that causes it to actually monitor the general routing >status of the
> device, both IPv4 and IPv6

とあるので、IPv4ではReachしないけど、IPv6でReachしているからOKということですかね。

iOS9.3.1でreachabilityWithAddressでIPv4アドレスリテラルを使うと失敗しますね。

[code]

    struct sockaddr_in addr;
    addr.sin_len = INET_ADDRSTRLEN;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr("XXX.XXX.XXX.XXX"); // ここは適当な0.0.0.0でない有効なグローバルIPを入れる
    Reachability* reachability = [Reachability reachabilityWithAddress:&addr];
    [reachability startNotifier];
    NSLog(@"reachable[%d]", reachability.currentReachabilityStatus); // ipv6環境では、NotReachableで、ipv4環境ではReachableViaWiFiになります
    
[/code]

他のバージョンでは試してません。

この辺も見ておいた方が良さそうです。

<https://github.com/AFNetworking/AFNetworking/issues/3498>


CC BY-SA 3.0
2016-05-12T08:38:00.187
24789
2016-05-13T07:42:32.833
2016-05-13T07:42:32.833
670
8601
24771
answer