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
- 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.
- 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.
- 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.
- 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.
Temas relacionados
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de