L'API des sockets est régie par les RFC de l'IETF et devrait être la même sur toutes les plateformes, y compris Windows WRT IPv6.
Pour les applications IPv4/IPv6, il s'agit de TOUTES à propos de getaddrinfo()
y getnameinfo()
. getaddrinfo
est un génie - il examine le DNS, les noms de port et les capacités du client pour résoudre l'éternelle question "puis-je utiliser IPv4, IPv6 ou les deux pour atteindre une destination particulière ?". Ou si vous optez pour la voie dual-stack et souhaitez qu'il renvoie des adresses IPv4 mappées en IPv6, il le fera également.
Il fournit une sockaddr *
structure qui peut être branchée sur bind()
, recvfrom()
, sendto()
et la famille d'adresses pour socket()
Dans de nombreux cas, cela signifie qu'il n'y a pas de désordre. sockaddr_in(6)
des structures à remplir et à traiter.
Pour les implémentations UDP, je serais prudent quant à la mise en place de sockets à double pile ou, plus généralement, à la liaison à toutes les interfaces ( INADDR_ANY
). Le problème classique est que, lorsque les adresses ne sont pas verrouillées (cf. bind()
) à des interfaces spécifiques et que le système dispose de plusieurs demandes d'interfaces, les réponses peuvent transiter par des adresses différentes pour les ordinateurs disposant de plusieurs adresses en fonction des caprices de la table de routage du système d'exploitation, ce qui perturbe les protocoles d'application, en particulier les systèmes ayant des exigences d'authentification.
Pour les implémentations UDP où cela ne pose pas de problème, ou TCP, les sockets à double pile peuvent faire gagner beaucoup de temps lors de l'activation IPv* de votre système. Il faut faire attention à ne pas se reposer entièrement sur la double pile lorsque ce n'est pas absolument nécessaire, car il ne manque pas de plateformes raisonnables (Old Linux, BSD, Windows 2003) déployées avec des piles IPv6 qui ne sont pas capables de prendre en charge les sockets à double pile.