Compatibilidad con IPv6
Para admitir IPv4 e IPv6 en Windows XP con Service Pack 1 (SP1) y en Windows Server 2003, una aplicación tiene que crear dos sockets, un socket para su uso con IPv4 y un socket para su uso con IPv6. La aplicación debe controlar estos dos sockets por separado.
Si un proveedor de servicios TCP/IP en Windows XP con SP1 y en Windows Server 2003 admite el direccionamiento IPv4 e IPv6, debe crear dos sockets independientes y escuchar por separado en estos sockets:
- Una vez para IPv4.
- Una vez para la familia de direcciones IPv6.
Windows Vista y versiones posteriores ofrecen la capacidad de crear un único socket IPv6 que pueda controlar el tráfico IPv6 e IPv4. Por ejemplo, se crea un socket de escucha TCP para IPv6, se coloca en modo de pila dual y se enlaza al puerto 5001. Este socket de doble pila puede aceptar conexiones de clientes TCP IPv6 que se conectan al puerto 5001 y desde clientes TCP IPv4 que se conectan al puerto 5001. Esta característica permite un diseño de aplicaciones muy simplificado y reduce la sobrecarga de recursos necesaria para las operaciones de contabilización en dos sockets independientes. Sin embargo, hay algunas restricciones que deben cumplirse para usar un socket de pila doble. Para obtener más información, consulte Sockets de pila dual.
WSAEnumProtocols devuelve dos estructuras WSAPROTOCOL_INFO para cada uno de los tipos de socket admitidos (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW). iAddressFamily debe establecerse en AF_INET para el direccionamiento IPv4 y en AF_INET6 para el direccionamiento IPv6.
Las direcciones IPv6 se describen en las estructuras siguientes.
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 */
};
Si una aplicación usa funciones de Windows Sockets 1.1 y quiere usar direcciones IPv6, puede seguir usando todas las funciones antiguas que toman la estructura sockaddr como uno de los parámetros (bind, connect, sendto y recvfrom, accept, etc.). El único cambio necesario es usar sockaddr_in6 en lugar de sockaddr_in.
Sin embargo, las funciones de resolución de nombres (gethostbyname, gethostbyaddr, etc.) y las funciones de conversión de direcciones (inet_addr, inet_ntoa) no se pueden reutilizar porque suponen que una dirección IP tiene una longitud de 4 bytes. Una aplicación que quiera realizar la resolución de nombres y la conversión de direcciones para direcciones IPv6 debe usar funciones específicas de Windows Sockets 2. Se han introducido muchas funciones nuevas para permitir que las aplicaciones de Windows Sockets 2 aprovechen las ventajas de IPv6, incluidas las funciones getaddrinfo y getnameinfo .
Para obtener más información sobre cómo habilitar las funcionalidades IPv6 en una aplicación, consulte la Guía de IPv6 para aplicaciones de Windows Sockets.