La réponse d'Aaron est, je le crains, à peu près incorrecte. Oui, les modifications de l'interface utilisateur seront nécessaires, mais tout code utilisant les API de socket traditionnelles nécessitera probablement des modifications substantielles pour prendre en charge IPv6.
Le code le plus ancien utilise une constante de "famille d'adresses" spécifique (AF_INET
) et une structure de données particulière (struct sockaddr_in
). Tout code qui utilise encore cela est effectivement bloqué dans les terres IPv4.
Code récent devrait utiliser les appels API modernes tels que getaddrinfo()
qui est capable de retourner les bonnes valeurs pour le protocole, la famille d'adresses (c.-à-AF_INET6
), adresse, etc., que l'hôte distant utilise IPv4 ou IPv6 (ou les deux) .
C'est un peu long, mais voici un exemple de code de la page man Linux pour getaddrinfo
. Notez comment l'appel reçoit une liste complète des adresses à distance possibles, et essaie chacun à son tour jusqu'à ce qu'il réussisse:
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
hints.ai_flags = 0;
hints.ai_protocol = 0; /* Any protocol */
s = getaddrinfo(hostname, service, &hints, &result);
if (s != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
/* getaddrinfo() returns a list of address structures.
Try each address until we successfully connect(2).
If socket(2) (or connect(2)) fails, we (close the socket
and) try the next address. */
for (rp = result; rp != NULL; rp = rp->ai_next) {
sfd = socket(rp->ai_family, rp->ai_socktype,
rp->ai_protocol);
if (sfd == -1)
continue;
if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
break; /* Success */
close(sfd);
}
if (rp == NULL) { /* No address succeeded */
fprintf(stderr, "Could not connect\n");
exit(EXIT_FAILURE);
}
freeaddrinfo(result); /* No longer needed */
votre compréhension est incorrecte. Les applications doivent toujours être capables de créer des sockets, des structures d'adresses, etc., qui ont toutes des variations spécifiques à IPv6. – Alnitak
Non, je pense que le résumé d'Aaron Axvig est assez juste. La plupart des applications ne doivent jamais manipuler les adresses IP directement. L'interface de socket est de très bas niveau: c'est comme le langage d'assemblage. Puissant mais très peu portable. – bortzmeyer