ios - 是否可以通过某种方式将 IPV6 地址转换为 IPV4 地址,或者始终检索 IPV4 地址?

标签 ios network-programming bonjour couchbase-lite

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

仅当蓝牙随机打开时(即五分之一),我们才能获取 IPV4 地址。此外,[NSNetService 地址] 仅返回数组中的一个地址。是否可以通过某种方式将 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);
        }
    }
}

最佳答案

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

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

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

这可能取决于 IPv6 地址格式,但这本质上就是这样做的方法。

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

关于ios - 是否可以通过某种方式将 IPV6 地址转换为 IPV4 地址,或者始终检索 IPV4 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312367/

相关文章:

c# - 对 SSPI 的调用失败,请参阅内部异常 - 无法联系本地安全机构

ios - 在 Firebase 和 Swift 3 中注册之前如何验证用户名是否存在?

iphone - 如何在运行时确定二进制图像架构?

iOS 二进制数据列未显示在 Sqlite 数据库中?

java - 从客户端发送多个服务器对象到服务器

iphone - 在 iPhone 上使用 bonjour 会自动启用蓝牙吗?

ios - 如何使用 Storyboards 和 Tab Bar Controller 作为初始 Controller 共享 UIManagedDocument?

c - 当内核需要创建 SKB 以通过网络设备接口(interface)发送时,内核如何知道要分配多少余量/余量?

windows - 如何在 Windows 中发布 Bonjour 服务?

bonjour - 从 IP 地址获取链接本地域名​​(即使用多播 DNS 和 DNS-SD 进行反向 DNS 查找)