Iphone IPv6地址能否在IPv4模式下工作?

Iphone IPv6地址能否在IPv4模式下工作?,iphone,networking,bind,ipv6,bsd,Iphone,Networking,Bind,Ipv6,Bsd,我正在将一些代码从IPv4迁移到IPv6,当然我需要保持IPv4的向后兼容性 我已经阅读了一些转换代码的文档和指南,并看到其中写道,使用许多较新的API(如inet_pton()而不是inet_addr())将只在IPv4和IPv6中工作 然而,在某些情况下,我仍然不清楚何时需要编写代码以不同的方式处理每个协议。具体来说,我不知道IPv6地址(使用sockaddr_存储结构的家庭AF_INET6)是否能在本地网络上工作 例如,假设我使用内置常量in6addr_环回创建这样一个地址,然后我尝试将其

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

我已经阅读了一些转换代码的文档和指南,并看到其中写道,使用许多较新的API(如inet_pton()而不是inet_addr())将只在IPv4和IPv6中工作

然而,在某些情况下,我仍然不清楚何时需要编写代码以不同的方式处理每个协议。具体来说,我不知道IPv6地址(使用sockaddr_存储结构的家庭AF_INET6)是否能在本地网络上工作

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

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


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

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

IPv4:

struct sockaddr\u in serv\u addr,cli\u addr;
sockfd=套接字(AF_INET,SOCK_STREAM,0);
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=INADDR_ANY;
serv_addr.sin_port=htons(端口号);
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
IPv6:

struct sockaddr\u in6 serv\u addr,cli\u addr;
sockfd=套接字(AF_INET6,SOCK_流,0);
serv_addr.sin6_family=AF_INET6;
serv_addr.sin6_addr=in6addr_any;
serv_addr.sin6_port=htons(端口号);
if(bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)

希望这有帮助

我知道如何创建这两种套接字类型,但我的问题是,我总是为所有场景创建IPv6类型。这是否适用于所有网络类型,包括只支持IPv4的网络?不,您需要同时支持这两种协议,除非您的ipv6主机为IPv4连接执行IPv4隧道。但我如何知道要使用哪种协议?为了简单起见,假设我只做到本地主机服务器的连接,我不理解你上面的问题。理论上:1)将有一个IPv6服务器线程,该线程绑定IPv6地址并接受所有IPv6客户端连接。2) 类似地,还会有另一个服务器线程绑定IPv4地址并接受所有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)
     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)