IPv6地址是否可以在IPv4模式下工作?

时间:2016-05-13 18:23:50

标签: iphone networking bind ipv6 bsd

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

每个接口都将使用mac地址派生链接本地ipv6地址。该地址足以用于本地网络内的通信。 关于套接字的创建,您需要指定系列(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)

希望这有帮助!