Condividi tramite


Modifica delle strutture di dati per le app Winsock IPv6

Quando si aggiunge il supporto per IPv6, è necessario assicurarsi che l'applicazione definisca strutture di dati di dimensioni appropriate. Le dimensioni di un indirizzo IPv6 sono molto più grandi di un indirizzo IPv4. Le strutture hardcoded per gestire le dimensioni di un indirizzo IPv4 durante l'archiviazione di un indirizzo IP causeranno problemi nell'applicazione e devono essere modificate.

Procedure consigliate

L'approccio migliore per garantire che le strutture siano dimensionati correttamente consiste nell'usare la struttura SOCKADDR_STORAGE. La struttura SOCKADDR_STORAGE è indipendente dalla versione dell'indirizzo IP. Quando la struttura SOCKADDR_STORAGE viene usata per archiviare gli indirizzi IP, gli indirizzi IPv4 e IPv6 possono essere gestiti correttamente con una codebase.

L'esempio seguente, che è un estratto tratto dal file Server.c trovato nell'Appendice B, identifica un uso appropriato della struttura SOCKADDR_STORAGE . Si noti che la struttura, se usata correttamente come illustrato in questo esempio, gestisce normalmente un indirizzo IPv4 o 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;
}

Nota

La struttura SOCKADDR_STORAGE è nuova per Windows XP.

 

Codice da evitare

In genere, molte applicazioni usavano la struttura sockaddr per archiviare indirizzi indipendenti dal protocollo o la struttura sockaddr_in per gli indirizzi IP. Né la struttura sockaddr né la struttura sockaddr_in è abbastanza grande da contenere indirizzi IPv6 e pertanto entrambi sono insufficienti se l'applicazione deve essere compatibile con IPv6.

Attività di codifica

Per modificare la codebase esistente da IPv4 a IPv4 e interoperabilità IPv6

  1. Acquisire l'utilità Checkv4.exe. L'utilità è inclusa in Microsoft Windows Software Development Kit (SDK).
  2. Eseguire l'utilità Checkv4.exe sul codice. Informazioni su come eseguire l'utilità Checkv4.exe sui file nella sezione Uso dell'utilità Checkv4.exe.
  3. L'utilità avvisa l'utilizzo delle strutture sockaddr o sockaddr_in e fornisce consigli su come sostituire con la struttura compatibile con IPv6 SOCKADDR_STORAGE.
  4. Sostituire eventuali istanze di questo tipo e il codice associato in base alle esigenze per usare la struttura SOCKADDR_STORAGE .

In alternativa, è possibile cercare nella base di codice le istanze delle strutture sockaddr e sockaddr_in e modificare tutto questo utilizzo (e altro codice associato, in base alle esigenze) alla struttura SOCKADDR_STORAGE .

Nota

Le strutture addrinfo e SOCKADDR_STORAGE includono rispettivamente i membri del protocollo e della famiglia di indirizzi (ai_family e ss_family). RFC 2553 specifica il membro ai_family di addrinfo come int, mentre ss_family viene specificato come breve. Di conseguenza, una copia diretta tra tali membri genera un errore del compilatore.

 

Guida IPv6 per le applicazioni Windows Sockets

Socket dual-stack per applicazioni Winsock IPv6

Chiamate di funzione per le applicazioni Winsock IPv6

Uso di indirizzi IPv4 hardcoded

Problemi dell'interfaccia utente per le applicazioni Winsock IPv6

Protocolli sottostanti per le applicazioni Winsock IPv6