Compartir a través de


Cambio de estructuras de datos para las appications de Winsock de IPv6

Al agregar compatibilidad con IPv6, debe asegurarse de que la aplicación define estructuras de datos de tamaño correcto. El tamaño de una dirección IPv6 es mucho mayor que una dirección IPv4. Las estructuras codificadas de forma rígida para controlar el tamaño de una dirección IPv4 al almacenar una dirección IP provocarán problemas en la aplicación y se deben modificar.

Procedimiento recomendado

El mejor enfoque para garantizar que las estructuras tengan el tamaño correcto es usar la estructura SOCKADDR_STORAGE . La estructura de SOCKADDR_STORAGE es independiente de la versión de dirección IP. Cuando se usa la estructura SOCKADDR_STORAGE para almacenar direcciones IP, las direcciones IPv4 e IPv6 se pueden controlar correctamente con una base de código.

En el ejemplo siguiente, que es un extracto tomado del archivo Server.c que se encuentra en el Apéndice B, se identifica un uso adecuado de la estructura SOCKADDR_STORAGE . Observe que la estructura, cuando se usa correctamente como se muestra en este ejemplo, controla correctamente una dirección IPv4 o IPv6.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

#define BUFFER_SIZE 512
#define DEFAULT_PORT "27015"

int main(int argc, char **argv)
{
    char Buffer[BUFFER_SIZE] = {0};
    char *Hostname;
    int Family = AF_UNSPEC;
    int SocketType = SOCK_STREAM;
    char *Port = DEFAULT_PORT;
    char *Address = NULL;
    int i = 0;
    DWORD dwRetval = 0;
    int iResult = 0;
    int FromLen = 0;
    int AmountRead = 0;

    SOCKADDR_STORAGE From;

    WSADATA wsaData;

    ADDRINFO *AddrInfo = NULL;
    ADDRINFO *AI = NULL;

    // Parse arguments
    if (argc >= 1) {
        Hostname = argv[1];
    }    

   // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    From.ss_family = (ADDRESS_FAMILY) Family;
    
    //...
        
        return 0;
}

Nota

La estructura SOCKADDR_STORAGE es nueva para Windows XP.

 

Código que se va a evitar

Normalmente, muchas aplicaciones usan la estructura sockaddr para almacenar direcciones independientes del protocolo o la estructura sockaddr_in para las direcciones IP. Ni la estructura sockaddr ni la estructura sockaddr_in son lo suficientemente grandes como para contener direcciones IPv6 y, por lo tanto, ambas son insuficientes si la aplicación es compatible con IPv6.

Tarea de codificación

Para modificar la base de código existente de IPv4 a IPv4 e interoperabilidad IPv6

  1. Adquiera la utilidad Checkv4.exe. La utilidad se incluye con el Kit de desarrollo de software (SDK) de Microsoft Windows que está disponible a través de su suscripción de MSDN o desde la web como descarga.
  2. Ejecute la utilidad Checkv4.exe en el código. Obtenga información sobre cómo ejecutar la utilidad Checkv4.exe en los archivos de la sección Sobre el uso de la utilidad Checkv4.exe.
  3. La utilidad le avisa del uso de estructuras de sockaddr o sockaddr_in , y proporciona recomendaciones sobre cómo reemplazar por la estructura compatible con IPv6 SOCKADDR_STORAGE.
  4. Reemplace las instancias de este tipo y el código asociado según corresponda para usar la estructura SOCKADDR_STORAGE .

Como alternativa, puede buscar en la base de código las instancias de las estructuras sockaddr y sockaddr_in , y cambiar todo ese uso (y otro código asociado, según corresponda) a la estructura de SOCKADDR_STORAGE .

Nota

Las estructuras addrinfo y SOCKADDR_STORAGE incluyen miembros de la familia de direcciones y protocolos (ai_family y ss_family), respectivamente. RFC 2553 especifica el miembro ai_family de addrinfo como un valor int, mientras que ss_family se especifica como un short; por lo tanto, una copia directa entre esos miembros produce un error del compilador.

 

Guía de IPv6 para aplicaciones de Windows Sockets

Sockets de doble pila para aplicaciones IPv6 Winsock

Llamadas de función para aplicaciones IPv6 Winsock

Uso de direcciones IPv4 codificadas de forma dura

Problemas de la interfaz de usuario para aplicaciones IPv6 Winsock

Protocolos subyacentes para aplicaciones winsock de IPv6