2014-10-11 3 views
1

우리는 다른 장치와의 연결에 bonjour를 사용하고 피어 데이터베이스를 사용하여 복제를 위해 couchbaseListener를 사용하는 ipad 용 iOS 응용 프로그램을 개발 중입니다. [nsnetservice addresses]가 IPV6 주소를 반환 할 때마다 복제가 성공하지 못하는 것을 관찰했습니다.IPV6 주소를 IPV4 주소로 변환하거나 IPV4 주소를 항상 검색 할 수 있습니까?

블루투스가 무작위로 켜지는 경우에만 IPV4 주소가 표시됩니다. 즉, 5 번 중 1 번입니다. 또한 [NSNetService addresses]는 배열에서 하나의 주소 만 반환합니다. IPV6 주소를 IPV4 주소로 변환하거나 IPV4 주소를 항상 검색 할 수 있습니까?

아래의 IP 주소로 변환하는 데 사용되는 코드를 찾으십시오.

char addressBuffer[INET6_ADDRSTRLEN]; 



for (NSData *data in self.addresses) 
{ 

    memset(addressBuffer, 0, INET6_ADDRSTRLEN); 

    typedef union { 
     struct sockaddr sa; 
     struct sockaddr_in ipv4; 
     struct sockaddr_in6 ipv6; 
    } ip_socket_address; 

    ip_socket_address *socketAddress = (ip_socket_address *)[data bytes]; 

    if (socketAddress && (socketAddress->sa.sa_family == AF_INET || socketAddress->sa.sa_family == AF_INET6)) 
    { 
     const char *addressStr = inet_ntop(
       socketAddress->sa.sa_family, 
       (socketAddress->sa.sa_family == AF_INET ? (void *)&(socketAddress->ipv4.sin_addr) : (void *)&(socketAddress->ipv6.sin6_addr)), 
       addressBuffer, 
       sizeof(addressBuffer)); 

     int port = ntohs(socketAddress->sa.sa_family == AF_INET ? socketAddress->ipv4.sin_port : socketAddress->ipv6.sin6_port); 

     if (addressStr && port) 
     { 
      NSLog(@"Found service at %s:%d", addressStr, port); 
     } 
    } 
} 

답변

1

IPv6 주소 자체는 (16 진수로 인코딩 된 IPv4 주소를 포함 후 : :)

의는 다음의 IPv6 주소가 있다고 가정 해 봅시다 : 2608 :: c0a8 : 1 (소형 폼)

이것은 다음 IPv4 주소로 변환됩니다. 192 (c0). 168 (a8). 0 (00 생략). 1 (01)

IPv6 주소 형식에 따라 다를 수 있지만 기본적으로 수행하는 방법입니다.

당신이 확실하지 않은 경우, 당신은이 변환기를 시도 할 수 있습니다 : http://v6decode.com/#address=2608%3A%3Ac0a8%3A1

+0

덕분에 같은 .Also을 할 수있는 코드를 찾고 반 스틴 :-) – Lakshminarayana

+0

덕분에 반 스틴 :-)는 IPV6 형식에 따라 달라집니다 나는 fe80 :: 68c8 : cfff : fef9 : 3856이 fe80 :: 68c8 : cfff : 254.249.56.86과 다르게 변환한다고 가정합니다. – Lakshminarayana

+0

올바른 양식은 fe80 :: 68c8 : cfff : fef9 : 3856입니다. 그러나 다른 형태도 가능합니다 (fe80 :: 68c8 : cfff : 254.249.56.86은 동일한 IPV4 주소로 변환됩니다). 인코딩하려는 IPv6 주소의 구문을 IPv4로 확인해야합니다. 도움이 되었다면이 게시물을 +1하기를 주저하지 마십시오. –

관련 문제