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 von der Anwendung separat behandelt werden.

Wenn ein TCP/IP-Dienstanbieter unter Windows XP mit SP1 und unter Windows Server 2003 die 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-Lauschocket für IPv6 erstellt, in den Dual Stack-Modus versetzt und an Port 5001 gebunden. Dieser Dual-Stack-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 ein stark vereinfachtes Anwendungsdesign und reduziert den Ressourcenaufwand, der für die Buchung von Vorgängen in zwei separaten Sockets erforderlich ist. 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 IPv4-Adressierung und auf AF_INET6 für IPv6-Adressierung festlegen.

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, werden möglicherweise weiterhin alle alten Funktionen verwendet, die die Sockaddr-Struktur als einen der Parameter verwenden (bind, connect, sendto und recvfrom, accept usw.). Die einzige Erforderliche Änderung besteht darin, sockaddr_in6 anstelle von sockaddr_in zu verwenden.

Die Namensauflösungsfunktionen (gethostbyname, gethostbyaddr usw.) und Adresskonvertierungsfunktionen (inet_addr, inet_ntoa) können jedoch nicht wiederverwendet werden, da sie davon ausgehen, dass eine IP-Adresse 4 Bytes lang ist. Eine Anwendung, die eine Namensauflösung und Adresskonvertierung für IPv6-Adressen durchführen möchte, muss windows Sockets 2-spezifische Funktionen verwenden. Viele neue Funktionen wurden eingeführt, um Windows Sockets 2-Anwendungen die Nutzung von IPv6 zu ermöglichen, einschließlich der Funktionen getaddrinfo und getnameinfo .

Weitere Informationen zum Aktivieren von IPv6-Funktionen in einer Anwendung finden Sie im IPv6-Leitfaden für Windows Sockets-Anwendungen.