Supporto IPv6

Per supportare sia IPv4 che IPv6 in Windows XP con Service Pack 1 (SP1) e in Windows Server 2003, un'applicazione deve creare due socket, un socket da usare con IPv4 e un socket da usare con IPv6. Questi due socket devono essere gestiti separatamente dall'applicazione.

Se un provider di servizi TCP/IP in Windows XP con SP1 e in Windows Server 2003 supporta l'indirizzamento IPv4 e IPv6, deve creare due socket separati ed essere in ascolto separatamente su questi socket:

  • Una volta per IPv4.
  • Una volta per la famiglia di indirizzi IPv6.

Windows Vista e versioni successive offrono la possibilità di creare un singolo socket IPv6 in grado di gestire il traffico IPv6 e IPv4. Ad esempio, viene creato un socket di ascolto TCP per IPv6, viene inserito in modalità dual stack e associato alla porta 5001. Questo socket dual stack può accettare connessioni da client TCP IPv6 che si connettono alla porta 5001 e dai client TCP IPv4 che si connettono alla porta 5001. Questa funzionalità consente una progettazione dell'applicazione notevolmente semplificata e riduce il sovraccarico delle risorse necessario per la registrazione delle operazioni su due socket separati. Esistono tuttavia alcune restrizioni che devono essere soddisfatte per usare un socket dual stack. Per altre informazioni, vedere Dual-Stack Sockets.

WSAEnumProtocols restituisce due strutture WSAPROTOCOL_INFO per ognuno dei tipi di socket supportati (SOCK_STREAM, SOCK_DGRAM SOCK_RAW). IAddressFamily deve essere impostato su AF_INET per l'indirizzamento IPv4 e su AF_INET6 per gli indirizzi IPv6.

Gli indirizzi IPv6 sono descritti nelle strutture seguenti.

struct in_addr6 {
    u_char    s6_addr[16];             /* IPv6 address */
};

struct sockaddr_in6 {
    short             sin6_family;     /* AF_INET6 */
    u_short           sin6_port;       /* Transport level port number */
    u_long            sin6_flowinfo;   /* IPv6 flow information */
    struct in_addr6   sin6_addr;       /* IPv6 address */
    u_long            sin6_scope_id;   /* set of interfaces for a scope */
   };

Se un'applicazione usa funzioni Windows Sockets 1.1 e vuole usare indirizzi IPv6, può continuare a usare tutte le funzioni precedenti che accettano la struttura sockaddr come uno dei parametri (bind, connect, sendto e recvfrom, accept e così via). L'unica modifica necessaria consiste nell'usare sockaddr_in6 anziché sockaddr_in.

Tuttavia, le funzioni di risoluzione dei nomi (gethostbyname, gethostbyaddr e così via) e le funzioni di conversione degli indirizzi (inet_addr, inet_ntoa) non possono essere riutilizzate perché presuppongono che un indirizzo IP sia di lunghezza pari a 4 byte. Un'applicazione che vuole eseguire la risoluzione dei nomi e la conversione degli indirizzi per gli indirizzi IPv6 deve usare funzioni specifiche di Windows Sockets 2. Molte nuove funzioni sono state introdotte per consentire alle applicazioni Windows Sockets 2 di sfruttare IPv6, incluse le funzioni getaddrinfo e getnameinfo .

Per altre informazioni su come abilitare le funzionalità IPv6 in un'applicazione, vedere la Guida IPv6 per le applicazioni Windows Sockets.