IPv6-support
För att stödja både IPv4 och IPv6 i Windows XP med Service Pack 1 (SP1) och på Windows Server 2003 måste ett program skapa två socketar, en socket för användning med IPv4 och en socket för användning med IPv6. Dessa två socketar måste hanteras separat av programmet.
Om en TCP/IP-tjänstprovider i Windows XP med SP1 och Windows Server 2003 stöder IPv4- och IPv6-adresser måste den skapa två separata socketar och lyssna separat på dessa socketar:
- En gång för IPv4.
- En gång för IPv6-adressfamiljen.
Windows Vista och senare erbjuder möjligheten att skapa en enda IPv6-socket som kan hantera både IPv6- och IPv4-trafik. Till exempel skapas en TCP-lyssningssocket för IPv6, placeras i läget för dubbla staplar och binds till port 5001. Den här socketen med dubbla staplar kan acceptera anslutningar från IPv6 TCP-klienter som ansluter till port 5001 och från IPv4 TCP-klienter som ansluter till port 5001. Den här funktionen möjliggör mycket förenklad programdesign och minskar de resurskostnader som krävs för att publicera åtgärder på två separata socketar. Det finns dock vissa begränsningar som måste uppfyllas för att kunna använda ett socket med dubbla staplar. Mer information finns i Dual-Stack Sockets.
WSAEnumProtocols returnerar två WSAPROTOCOL_INFO strukturer för var och en av de sockettyper som stöds (SOCK_STREAM, SOCK_DGRAM SOCK_RAW). iAddressFamily måste anges till AF_INET för IPv4-adressering och för att AF_INET6 för IPv6-adressering.
IPv6-adresserna beskrivs i följande strukturer.
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 */
};
Om ett program använder Windows Sockets 1.1-funktioner och vill använda IPv6-adresser kan det fortsätta att använda alla gamla funktioner som tar sockaddr- struktur som en av parametrarna (binda, ansluta, sendtooch recvfrom, , accepteraroch så vidare). Den enda ändring som krävs är att använda sockaddr_in6 i stället för sockaddr_in.
Namnmatchningsfunktionerna (gethostbyname, gethostbyaddroch så vidare) och adresskonverteringsfunktioner (inet_addr, inet_ntoa) kan dock inte återanvändas eftersom de förutsätter att en IP-adress är 4 byte lång. Ett program som vill utföra namnmatchning och adresskonvertering för IPv6-adresser måste använda Windows Sockets 2-specifika funktioner. Många nya funktioner har introducerats för att göra det möjligt för Windows Sockets 2-program att dra nytta av IPv6, inklusive funktionerna getaddrinfo och getnameinfo.
Mer information om hur du aktiverar IPv6-funktioner i ett program finns i IPv6-guide för Windows Sockets-program.