我正在努力将一些代码从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硬件上运行,以防万一。
答案 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)
希望这有帮助!