Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour prendre en charge IPv4 et IPv6 sous Windows XP avec Service Pack 1 (SP1) et sous Windows Server 2003, une application doit créer deux sockets, l’un pour IPv4 et l’autre pour IPv6. Ces deux prises doivent être gérées séparément par l’application.
Windows Vista et versions ultérieures offrent la possibilité de créer un seul socket IPv6 capable de gérer à la fois le trafic IPv6 et IPv4. Par exemple, un socket d’écoute TCP pour IPv6 est créé, mis en mode double pile et lié au port 5001. Ce socket à double pile peut accepter des connexions à partir de clients TCP IPv6 se connectant au port 5001 et de clients TCP IPv4 se connectant au port 5001. Cette fonctionnalité permet de simplifier considérablement la conception de l’application et de réduire la surcharge de ressources requise pour les opérations de publication sur deux sockets distincts.
Création d’un socket Dual-Stack
Par défaut, un socket IPv6 créé sous Windows Vista et versions ultérieures ne fonctionne que sur le protocole IPv6. Pour transformer un socket IPv6 en un socket à double pile, la fonction setsockopt doit être appelée avec l’option IPV6_V6ONLY socket pour définir cette valeur à zéro avant que le socket ne soit lié à une adresse IP. Lorsque l’option IPV6_V6ONLY socket est définie sur zéro, un socket créé pour la famille d’adresses AF_INET6 peut être utilisé pour envoyer et recevoir des paquets vers et depuis une adresse IPv6 ou une adresse mappée IPv4.
Adresses IP avec un socket Dual-Stack
Les sockets à double pile nécessitent toujours des adresses IPv6. La possibilité d’interagir avec une adresse IPv4 nécessite l’utilisation du format d’adresse IPv6 mappé IPv4. Toutes les adresses IPv4 doivent être représentées au format d’adresse IPv6 mappée à IPv4, qui permet à une application exclusivement IPv6 de communiquer avec un nœud IPv4. Le format d’adresse IPv6 mappée à IPv4 permet à l’adresse IPv4 d’un nœud IPv4 d’être représentée sous la forme d’une adresse IPv6. L’adresse IPv4 est codée dans les 32 bits de poids faible de l’adresse IPv6, et les 96 bits de poids fort contiennent le préfixe fixe 0:0:0:0:0:FFFF. Le format d’adresse IPv6 mappée à IPv4 est spécifié dans la RFC 4291. Pour plus d’informations, consultez www.ietf.org/rfc/rfc4291.txt. La macro IN6ADDR_SETV4MAPPED dans Mstcpip.h peut être utilisée pour convertir une adresse IPv4 au format d’adresse IPv6 mappée à IPv4 nécessaire.
Si le protocole sous-jacent est en fait IPv4, l’adresse IPv4 est mappée dans un format d’adresse IPv6 mappé IPv4. C’est-à-dire que le champ de famille dans la structure SOCKADDR indique AF_INET6, mais une adresse IPv6 mappée IPv4 est codée dans la structure d’adresses IPv6. Pour un socket à double pile en mode d’écoute, cela signifie que toutes les connexions IPv4 acceptées renverront une adresse IPv6 mappée IPv4. Pour un socket à double pile qui se connecte à une destination IPv4, la structure SOCKADDR passée pour se connecter doit être une adresse IPv6 mappée IPv4. Les applications doivent veiller à gérer correctement ces adresses IPv6 mappées IPv4 et ne les utiliser qu’avec des sockets à double pile. Si une adresse IP doit être transmise à un socket IPv4 standard, l’adresse doit être une adresse IPv4 standard et non une adresse IPv6 mappée IPv4.
Problèmes potentiels lors de l’utilisation d’un socket Dual-Stack
Un piège potentiel pour les applications consiste à obtenir une adresse IPv6 mappée IPv4 sur un socket à double pile, puis à essayer d’utiliser l’adresse IP renvoyée sur un autre socket IPv6 uniquement. Par exemple, les fonctions getsockname ou getpeername peuvent renvoyer une adresse IPv6 mappée IPv4 lorsqu’elles sont utilisées sur un socket à double pile. Si l’adresse IPv6 mappée IPv4 renvoyée est ensuite utilisée sur un autre socket qui n’a pas été défini sur Dual-Stack (un socket IPv6 uniquement qui est le comportement par défaut lors de la création d’un socket), toute utilisation de ce socket IPv6 uniquement avec une adresse IPv6 mappée IPv4 échouera. Le format d’adresse IPv6 mappé IPv4 ne peut être utilisé que sur un socket à double pile.
Sur un socket de datagramme à double pile, si une application nécessite la fonction LPFN_WSARECVMSG (WSARecvMsg) pour renvoyer des informations de paquet dans une structure WSAMSG pour les datagrammes reçus via IPv4, IP_PKTINFO option de socket doit être définie sur true sur le socket. Si seule l’option IPV6_PKTINFO est définie sur true sur le socket, les informations de paquet seront fournies pour les datagrammes reçus via IPv6, mais ne peuvent pas être fournies pour les datagrammes reçus via IPv4.
Si une application tente de définir l’option IP_PKTINFO socket sur un socket de datagramme à double pile et que IPv4 est désactivé sur le système, la fonction setsockopt échoue et WSAGetLastError renvoie l’erreur WSAEINVAL. Cette même erreur est également renvoyée par la fonction setsockopt à la suite d’autres erreurs. Si une application tente de définir une option de socket de niveau IPPROTO_IP sur un socket à double pile et qu’elle échoue avec WSAEINVAL, l’application doit déterminer si IPv4 est désactivé sur l’ordinateur local. Une méthode qui peut être utilisée pour détecter si IPv4 est activé ou désactivé consiste à appeler la fonction socket avec le paramètre af défini sur AF_INET pour essayer de créer un socket IPv4. Si la fonction socket échoue et que WSAGetLastError renvoie une erreur WSAEAFNOSUPPORT, cela signifie que IPv4 n’est pas activé. Dans ce cas, l’application peut ignorer l’échec d’une fonction setsockopt lors de la tentative de définition de l’option IP_PKTINFO socket. Dans le cas contraire, un échec lors de la tentative de définition de l’option IP_PKTINFO socket doit être traité comme une erreur inattendue.
Pour un socket à double pile lors de l’envoi de datagrammes avec la fonction WSASendMsg et qu’une application souhaite spécifier une adresse IP source locale spécifique à utiliser, la méthode de gestion dépend de l’adresse IP de destination. Lors de l’envoi à une adresse de destination IPv4 ou à une adresse de destination IPv6 mappée IPv4, l’un des objets de données de contrôle passés dans la structure WSAMSG pointée par le paramètre lpMsg doit contenir une structure in_pktinfo contenant l’adresse source IPv4 locale à utiliser pour l’envoi. Lors de l’envoi à une adresse de destination IPv6 qui n’est pas une adresse IPv6 mappée IPv4, l’un des objets de données de contrôle passés dans la structure WSAMSG pointée par le paramètre lpMsg doit contenir une structure in6_pktinfo contenant l’adresse source IPv6 locale à utiliser pour l’envoi.
Rubriques connexes
-
Changement des structures de données pour les applications Winsock IPv6
-
Problèmes d’interface utilisateur pour les applications Winsock IPv6