是否有可能以某种方式将IPV6地址转换为IPV4地址,或者总是检索IPV4地址?

时间:2014-10-11 07:49:28

标签: ios network-programming bonjour couchbase-lite

我们正在为ipad开发一个iOS应用程序,它使用bonjour连接其他设备,使用couchbaseListener进行对等数据库的复制。 我们观察到,只要[nsnetservice addresses]返回IPV6地址,复制就不会太多了。

我们只在蓝牙随机打开时获得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 个答案:

答案 0 :(得分:1)

IPv6地址本身包含以十六进制编码的IPv4地址(在::)之后

我们假设您拥有以下IPv6地址:2608 :: c0a8:1(紧凑形式)

这转换为以下IPv4地址:192(c0)。 168(a8)。 0(00省略)。 1(01)

它可能取决于IPv6地址格式,但基本上是这样做的。

如果您不确定,可以尝试使用此转换器:http://v6decode.com/#address=2608%3A%3Ac0a8%3A1