【问题标题】:Will IPv6 addresses work in IPv4 mode?IPv6 地址会在 IPv4 模式下工作吗?
【发布时间】:2016-09-10 01:25:25
【问题描述】:

我正在将一些代码仅从 IPv4 迁移到 IPv6,当然我需要保留 IPv4 的向后兼容性。

我已经阅读了一些用于转换我的代码的文档和指南,并且看到它写道,使用许多较新的 API(例如 inet_pton() 而不是 inet_addr())将只适用于 IPv4 和 IPv6。

但是,在某些情况下,我还不清楚何时需要编写代码来以不同的方式处理每个协议。具体来说,我不知道 IPv6 地址(使用 sockaddr_storage 结构的系列 AF_INET6)是否可以在本地网络上工作。

例如,假设我使用内置常量 in6addr_loopback 创建了这样一个地址,然后我尝试将其用作 bind() 调用的参数。

这是否适用于 IPv4 和 IPv6,或者我需要为每种情况创建正确的地址类型(AF_INET 与 AF_INET6)?我是否连接到本地套接字(即本例中的环回)而不是外部设备上的套接字是否重要?

我的客户端代码正在 iPhone/iPad 硬件上运行,以防万一。

【问题讨论】:

    标签: iphone networking bind ipv6 bsd


    【解决方案1】:

    每个接口都将使用 mac 地址派生一个链接本地 ipv6 地址。此地址足以在本地网络内进行通信。 关于so​​cket的创建,需要指定family(AF_INET和AF_INET6)并初始化绑定。

    IPv4:

         struct sockaddr_in serv_addr, cli_addr;
         sockfd = socket(AF_INET, SOCK_STREAM, 0);
         serv_addr.sin_family = AF_INET;
         serv_addr.sin_addr.s_addr = INADDR_ANY;
         serv_addr.sin_port = htons(portno);
    
         if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    

    IPv6:

         struct sockaddr_in6 serv_addr, cli_addr;
         sockfd = socket(AF_INET6, SOCK_STREAM, 0);
         serv_addr.sin6_family = AF_INET6;
         serv_addr.sin6_addr = in6addr_any;
         serv_addr.sin6_port = htons(portno);
    
         if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    

    希望这会有所帮助!

    【讨论】:

    • 我知道如何创建这两种套接字类型,但我的问题是我总是为所有场景创建一个 IPv6 类型。这适用于所有网络类型,包括纯 IPv4 网络吗?
    • 不,您需要同时支持这两种协议,除非您的 ipv6 主机为 ipv4 连接使用 ipv4 隧道。
    • 但是我怎么知道使用哪个协议呢?为简单起见,假设我只连接到 localhost 服务器。
    • 我不明白你的上述问题。理论上: 1) 会有一个 IPv6 服务器线程绑定 IPv6 地址并接受所有 IPv6 客户端连接。 2) 同样,将有另一个服务器线程绑定 IPv4 地址并接受所有 IPv4 客户端连接。这是你想知道的吗?您能否详细说明您面临的实施挑战。
    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 2013-09-18
    • 1970-01-01
    • 2021-12-24
    • 2011-06-24
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多