2016-05-13 1 views
1

Je suis en train de migrer du code d'IPv4 vers IPv6, et bien sûr je dois conserver la rétrocompatibilité pour IPv4. J'ai lu des documents et des guides pour convertir mon code, et j'ai vu qu'il écrit que l'utilisation de nombreuses nouvelles API (comme inet_pton() au lieu de inet_addr()) fonctionnera à la fois dans IPv4 et IPv6.Les adresses IPv6 fonctionneront-elles en mode IPv4?

Cependant, dans certains cas, il n'est toujours pas clair quand j'ai besoin d'écrire du code pour gérer chaque protocole d'une manière différente. Plus précisément, je ne sais pas si une adresse IPv6 (famille AF_INET6 utilisant la structure sockaddr_storage) fonctionnera sur un réseau local. Par exemple, supposons que je crée une telle adresse en utilisant la constante intégrée in6addr_loopback, puis j'essaie d'utiliser cela pour un paramètre à un appel bind(). Est-ce que cela fonctionnera dans IPv4 et IPv6, ou je dois créer le bon type d'adresse (AF_INET vs AF_INET6) pour chaque cas? Est-ce important que je me connecte à un socket local (c'est-à-dire le loopback comme dans ce cas) par opposition à un socket sur un périphérique externe?

Mon code client s'exécute sur le matériel iPhone/iPad au cas où cela serait important.

Répondre

2

Chaque interface dérivera une adresse ipv6 locale de lien utilisant l'adresse MAC. Cette adresse est suffisante pour la communication au sein du réseau local. Concernant la création de socket, vous devez spécifier la famille (AF_INET et AF_INET6) et l'initialiser et la lier.

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) 

espérons que cette aide!

+0

Je sais comment créer les deux types de socket, mais ma question est que je crée toujours un type IPv6 pour tous les scénarios. Cela fonctionnera-t-il pour tous les types de réseaux, y compris un réseau IPv4 uniquement? – Locksleyu

+0

Non, vous devez prendre en charge les deux protocoles, sauf si votre hôte ipv6 effectue un tunneling ipv4 pour les connexions ipv4. – Pramod

+0

Mais comment savoir quel protocole utiliser? Pour simplifier les choses, disons que je ne fais que des connexions à un serveur localhost. – Locksleyu