우리는 다른 장치와의 연결에 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);
}
}
}
덕분에 같은 .Also을 할 수있는 코드를 찾고 반 스틴 :-) – Lakshminarayana
덕분에 반 스틴 :-)는 IPV6 형식에 따라 달라집니다 나는 fe80 :: 68c8 : cfff : fef9 : 3856이 fe80 :: 68c8 : cfff : 254.249.56.86과 다르게 변환한다고 가정합니다. – Lakshminarayana
올바른 양식은 fe80 :: 68c8 : cfff : fef9 : 3856입니다. 그러나 다른 형태도 가능합니다 (fe80 :: 68c8 : cfff : 254.249.56.86은 동일한 IPV4 주소로 변환됩니다). 인코딩하려는 IPv6 주소의 구문을 IPv4로 확인해야합니다. 도움이 되었다면이 게시물을 +1하기를 주저하지 마십시오. –