IPv6-Unterstützung
Um sowohl IPv4 als auch IPv6 unter Windows XP mit Service Pack 1 (SP1) und Windows Server 2003 zu unterstützen, muss eine Anwendung zwei Sockets erstellen, einen Socket für die Verwendung mit IPv4 und einen Socket für die Verwendung mit IPv6. Diese beiden Sockets müssen separat von der Anwendung behandelt werden.
Wenn ein TCP/IP-Dienstanbieter unter Windows XP mit SP1 und windows Server 2003 IPv4- und IPv6-Adressierung unterstützt, muss er zwei separate Sockets erstellen und separat auf diesen Sockets lauschen:
- Einmal für IPv4.
- Einmal für die IPv6-Adressfamilie.
Windows Vista und höher bieten die Möglichkeit, einen einzelnen IPv6-Socket zu erstellen, der sowohl IPv6- als auch IPv4-Datenverkehr verarbeiten kann. Beispielsweise wird ein TCP-Überwachungssocket für IPv6 erstellt, in den Dual-Stack-Modus versetzt und an Port 5001 gebunden. Dieser Dualstapel-Socket kann Verbindungen von IPv6-TCP-Clients akzeptieren, die eine Verbindung mit Port 5001 herstellen, und von IPv4-TCP-Clients, die eine Verbindung mit Port 5001 herstellen. Dieses Feature ermöglicht einen erheblich vereinfachten Anwendungsentwurf und reduziert den Ressourcenaufwand für Buchungen in zwei separaten Sockets. Es gibt jedoch einige Einschränkungen, die erfüllt werden müssen, um einen Dual-Stack-Socket zu verwenden. Weitere Informationen finden Sie unter Dual-Stack Sockets.
WSAEnumProtocols gibt zwei WSAPROTOCOL_INFO Strukturen für jeden unterstützten Sockettyp zurück (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW). Die iAddressFamily- muss auf AF_INET für die IPv4-Adressierung festgelegt und für die IPv6-Adressierung AF_INET6.
Die IPv6-Adressen werden in den folgenden Strukturen beschrieben.
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 */
};
Wenn eine Anwendung Windows Sockets 1.1-Funktionen verwendet und IPv6-Adressen verwenden möchte, können weiterhin alle alten Funktionen verwendet werden, die die sockaddr-struktur als einen der Parameter verwenden (binden, verbinden, sendtound recvfrom, akzeptierenusw.). Die einzige erforderliche Änderung besteht darin, sockaddr_in6 anstelle von sockaddr_inzu verwenden.
Die Namensauflösungsfunktionen (gethostbyname, gethostbyaddrusw.) und Adresskonvertierungsfunktionen (inet_addr, inet_ntoa) können jedoch nicht wiederverwendet werden, da davon ausgegangen wird, dass eine IP-Adresse 4 Byte lang ist. Eine Anwendung, die namensauflösung und Adresskonvertierung für IPv6-Adressen ausführen möchte, muss Windows Sockets 2-spezifische Funktionen verwenden. Viele neue Funktionen wurden eingeführt, um Windows Sockets 2-Anwendungen zu ermöglichen, IPv6 zu nutzen, einschließlich der getaddrinfo und getnameinfo Funktionen.
Weitere Informationen zum Aktivieren von IPv6-Funktionen in einer Anwendung finden Sie im IPv6-Handbuch für Windows Sockets-Anwendungen.