Partager via


Modification des structures de données pour les applications Winsock IPv6

Lorsque vous ajoutez la prise en charge d’IPv6, vous devez vous assurer que votre application définit des structures de données correctement dimensionnées. 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 entraînent des problèmes dans votre application et doivent être modifiées.

Bonne pratique

La meilleure approche pour s’assurer que vos structures sont correctement dimensionnées consiste à utiliser la structure SOCKADDR_STORAGE . La structure SOCKADDR_STORAGE est indépendante de 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 gérées correctement avec une seule base de code.

L’exemple suivant, qui est un extrait du fichier Server.c de l’Annexe B, identifie une utilisation appropriée de la structure SOCKADDR_STORAGE . Notez que la structure, lorsqu’elle est utilisée correctement comme le montre cet exemple, gère correctement une adresse IPv4 ou 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;
}

Notes

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 les 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 par conséquent, les deux sont insuffisantes si votre application doit être compatible IPv6.

Tâche de codage

Pour modifier votre base de code existante d’IPv4 en interopérabilité IPv4 et IPv6

  1. Acquérir l’utilitaire Checkv4.exe. L’utilitaire est inclus dans le Kit de développement logiciel (SDK) Microsoft Windows, qui est disponible via votre abonnement MSDN ou sur le web en tant que téléchargement.
  2. Exécutez l’utilitaire Checkv4.exe sur votre code. Découvrez comment exécuter l’utilitaire Checkv4.exe sur vos fichiers dans la section Utilisation de l’utilitaire Checkv4.exe.
  3. L’utilitaire vous avertit de l’utilisation de structures sockaddr ou sockaddr_in et fournit des recommandations sur la façon de remplacer par la structure compatible IPv6 SOCKADDR_STORAGE.
  4. Remplacez ces instances et le code associé, le cas échéant, pour utiliser la structure SOCKADDR_STORAGE .

Vous pouvez également rechercher dans votre base de code des instances des structures sockaddr et sockaddr_in , et modifier toutes ces utilisations (et tout autre code associé, le cas échéant) par la structure SOCKADDR_STORAGE .

Notes

Les structures addrinfo et SOCKADDR_STORAGE incluent des membres de la famille de protocole et d’adresse (ai_family et ss_family), respectivement. RFC 2553 spécifie le ai_family membre de addrinfo en tant que int, tandis que ss_family est spécifié en tant que court ; en tant que tel, une copie directe entre ces membres entraîne une erreur du compilateur.

 

Guide IPv6 pour les applications Windows Sockets

Sockets à double pile pour les applications Winsock IPv6

Appels de fonction pour les applications Winsock IPv6

Utilisation d’adresses IPv4 codées en dur

Problèmes d’interface utilisateur pour les applications Winsock IPv6

Protocoles sous-jacents pour les applications Winsock IPv6