Changement des structures de données pour les applications Winsock IPv6
Lors de l’ajout de la prise en charge de l’IPv6, vous devez vous assurer que votre application définit des structures de données de taille appropriée. La taille d’une adresse IPv6 est beaucoup plus grande qu’une adresse IPv4. Les structures codées en dur pour gérer la taille d’une adresse IPv4 lors du stockage d’une adresse IP causeront des problèmes dans votre application et doivent être modifiées.
Conseil
La meilleure approche pour garantir que vos structures sont de taille appropriée est d’utiliser la structure SOCKADDR_STORAGE. La structure SOCKADDR_STORAGE est agnostique à la version de l’adresse IP. Lorsque la structure SOCKADDR_STORAGE est utilisée pour stocker des adresses IP, les adresses IPv4 et IPv6 peuvent être correctement gérées avec une seule base de code.
L’exemple suivant, qui est un extrait tiré du fichier Server.c trouvé en Annexe B, identifie une utilisation appropriée de la structure SOCKADDR_STORAGE. Remarquez que la structure, lorsqu’elle est utilisée correctement comme le montre cet exemple, gère gracieusement soit une adresse IPv4 soit une adresse IPv6.
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#define BUFFER_SIZE 512
#define DEFAULT_PORT "27015"
int main(int argc, char **argv)
{
char Buffer[BUFFER_SIZE] = {0};
char *Hostname;
int Family = AF_UNSPEC;
int SocketType = SOCK_STREAM;
char *Port = DEFAULT_PORT;
char *Address = NULL;
int i = 0;
DWORD dwRetval = 0;
int iResult = 0;
int FromLen = 0;
int AmountRead = 0;
SOCKADDR_STORAGE From;
WSADATA wsaData;
ADDRINFO *AddrInfo = NULL;
ADDRINFO *AI = NULL;
// Parse arguments
if (argc >= 1) {
Hostname = argv[1];
}
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
From.ss_family = (ADDRESS_FAMILY) Family;
//...
return 0;
}
Remarque
La structure SOCKADDR_STORAGE est nouvelle pour Windows XP.
Code à éviter
En règle générale, de nombreuses applications utilisaient la structure sockaddr pour stocker des adresses indépendantes du protocole, ou la structure sockaddr_in pour les adresses IP. Ni la structure sockaddr ni la structure sockaddr_in ne sont suffisamment grandes pour contenir des adresses IPv6, et sont donc insuffisantes si votre application doit être compatible IPv6.
Tâche de codage
Pour modifier votre base de code existante de l’IPv4 à l’interopérabilité IPv4 et IPv6
- Récupérez l’utilitaire Checkv4.exe. L’utilitaire est inclus avec le Kit de développement logiciel (SDK) Microsoft Windows.
- Exécutez l’utilitaire Checkv4.exe sur votre code. Apprenez à exécuter l’utilitaire Checkv4.exe sur vos fichiers dans la section sur Utilisation de l’utilitaire Checkv4.exe.
- L’utilitaire vous alerte sur l’utilisation des structures sockaddr ou sockaddr_in, et fournit des recommandations sur la façon de remplacer chacune par la structure compatible IPv6 SOCKADDR_STORAGE.
- Remplacez toutes ces instances, et le code associé comme approprié, pour utiliser la structure SOCKADDR_STORAGE.
Alternativement, vous pouvez rechercher dans votre base de code les instances des structures sockaddr et sockaddr_in, et changer toute cette utilisation (et le code associé, comme approprié) pour la structure SOCKADDR_STORAGE.
Remarque
Les structures addrinfo et SOCKADDR_STORAGE incluent respectivement des membres de protocole et de famille d’adresses (ai_family et ss_family). Le RFC 2553 spécifie que le membre ai_family de addrinfo est un int, tandis que ss_family est spécifié comme un short ; en tant que tel, une copie directe entre ces membres entraîne une erreur de compilation.
Rubriques connexes