IPv6-ondersteuning
Om zowel IPv4 als IPv6 op Windows XP te ondersteunen met Service Pack 1 (SP1) en windows Server 2003, moet een toepassing twee sockets maken, één socket voor gebruik met IPv4 en één socket voor gebruik met IPv6. Deze twee sockets moeten afzonderlijk worden verwerkt door de toepassing.
Als een TCP/IP-serviceprovider in Windows XP met SP1 en windows Server 2003 IPv4- en IPv6-adressering ondersteunt, moet deze twee afzonderlijke sockets maken en afzonderlijk luisteren op deze sockets:
- Eenmaal voor IPv4.
- Eenmaal voor de IPv6-adresfamilie.
Windows Vista en hoger bieden de mogelijkheid om één IPv6-socket te maken die zowel IPv6- als IPv4-verkeer kan verwerken. Er wordt bijvoorbeeld een TCP-luistersocket voor IPv6 gemaakt, in de dual-stackmodus geplaatst en gebonden aan poort 5001. Deze dual-stack socket kan verbindingen van IPv6 TCP-clients accepteren die verbinding maken met poort 5001 en van IPv4 TCP-clients die verbinding maken met poort 5001. Deze functie biedt een aanzienlijk vereenvoudigd toepassingsontwerp en vermindert de resourceoverhead die nodig is voor het boeken van bewerkingen op twee afzonderlijke sockets. Er zijn echter enkele beperkingen waaraan moet worden voldaan om een dubbele stack-socket te kunnen gebruiken. Zie Dual-Stack Socketsvoor meer informatie.
WSAEnumProtocols retourneert twee WSAPROTOCOL_INFO structuren voor elk van de ondersteunde sockettypen (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW). De iAddressFamily- moet zijn ingesteld op AF_INET voor IPv4-adressering en op AF_INET6 voor IPv6-adressering.
De IPv6-adressen worden beschreven in de volgende structuren.
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 */
};
Als een toepassing gebruikmaakt van Windows Sockets 1.1-functies en IPv6-adressen wil gebruiken, kan deze alle oude functies blijven gebruiken die de sockaddr- structuur als een van de parameters (binden, verbinding maken, sendtoen recvfrom, accepteren, enzovoort). De enige wijziging die vereist is, is het gebruik van sockaddr_in6 in plaats van sockaddr_in.
De naamomzettingsfuncties (gethostbyname, gethostbyaddr, enzovoort) en adresconversiefuncties (inet_addr, inet_ntoa) kunnen echter niet opnieuw worden gebruikt omdat ze aannemen dat een IP-adres 4 bytes lang is. Een toepassing die naamomzetting en adresconversie voor IPv6-adressen wil uitvoeren, moet gebruikmaken van Windows Sockets 2-specifieke functies. Veel nieuwe functies zijn geïntroduceerd om Windows Sockets 2-toepassingen in staat te stellen gebruik te maken van IPv6, waaronder de getaddrinfo en getnameinfo functies.
Zie de IPv6-handleiding voor Windows Sockets-toepassingenvoor meer informatie over het inschakelen van IPv6-mogelijkheden in een toepassing.