Partilhar via


Alterando estruturas de dados para aplicativos Winsock IPv6

Ao adicionar suporte para IPv6, você deve garantir que seu aplicativo defina estruturas de dados de tamanho adequado. O tamanho de um endereço IPv6 é muito maior do que um endereço IPv4. Estruturas que são codificadas para lidar com o tamanho de um endereço IPv4 ao armazenar um endereço IP causarão problemas em seu aplicativo e devem ser modificadas.

Melhores Práticas

A melhor abordagem para garantir que suas estruturas sejam dimensionadas corretamente é usar a estrutura SOCKADDR_STORAGE. A estrutura SOCKADDR_STORAGE é agnóstica à versão do endereço IP. Quando a estrutura SOCKADDR_STORAGE é usada para armazenar endereços IP, os endereços IPv4 e IPv6 podem ser tratados corretamente com uma base de código.

O exemplo a seguir, que é um trecho retirado do arquivo Server.c encontrado no Apêndice B, identifica um uso apropriado da estrutura SOCKADDR_STORAGE. Observe que a estrutura, quando usada corretamente, como mostra este exemplo, lida graciosamente com um endereço IPv4 ou 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;
}

Observação

A estrutura SOCKADDR_STORAGE é nova para o Windows XP.

 

Código a evitar

Normalmente, muitos aplicativos usavam a estrutura sockaddr para armazenar endereços independentes de protocolo ou a estrutura sockaddr_in para endereços IP. Nem a estrutura sockaddr nem a estrutura sockaddr_in são grandes o suficiente para conter endereços IPv6 e, portanto, ambos são insuficientes para que seu aplicativo seja compatível com IPv6.

Tarefa de codificação

Para tornar a sua base de código existente compatível com IPv4 e IPv6

  1. Adquira o utilitário Checkv4.exe. O utilitário está incluído no Microsoft Windows Software Development Kit (SDK).
  2. Execute o utilitário Checkv4.exe em seu código. Saiba mais sobre como executar o utilitário Checkv4.exe nos seus arquivos na seção Usando o utilitário Checkv4.exe.
  3. O utilitário alerta-o sobre o uso de estruturas sockaddr ou sockaddr_in, e fornece recomendações sobre como substituir ambas pela estrutura compatível com IPv6 SOCKADDR_STORAGE.
  4. Substitua quaisquer dessas instâncias e o respetivo código, conforme apropriado, para usar a estrutura SOCKADDR_STORAGE.

Como alternativa, pode-se pesquisar na sua base de código por instâncias das estruturas sockaddr e sockaddr_in e alterar todas essas utilizações (e qualquer outro código associado, conforme apropriado) para a estrutura SOCKADDR_STORAGE.

Observação

As estruturas addrinfo e SOCKADDR_STORAGE incluem o protocolo e o endereço dos membros da família (ai_family e ss_family), respectivamente. RFC 2553 especifica o membro ai_family de addrinfo como um int, enquanto ss_family é especificado como um short; como tal, uma cópia direta entre esses membros resulta em um erro de compilador.

 

Guia IPv6 para aplicativos Windows Sockets

Soquetes Dual-Stack para aplicativos Winsock IPv6

chamadas de funções para aplicativos que utilizam Winsock para IPv6

Uso de endereços IPv4 codificados

Problemas de interface do usuário para aplicativos Winsock IPv6

protocolos subjacentes para aplicativos Winsock IPv6