Compartilhar via


Suporte a IPv6

Para dar suporte a IPv4 e IPv6 no Windows XP com Service Pack 1 (SP1) e no Windows Server 2003, um aplicativo precisa criar dois soquetes, um soquete para uso com IPv4 e um soquete para uso com IPv6. Esses dois soquetes devem ser manipulados separadamente pelo aplicativo.

Se um provedor de serviços TCP/IP no Windows XP com SP1 e no Windows Server 2003 der suporte a endereçamento IPv4 e IPv6, ele deverá criar dois soquetes separados e escutar separadamente nestes soquetes:

  • Uma vez para IPv4.
  • Uma vez para a família de endereços IPv6.

O Windows Vista e posteriores oferecem a capacidade de criar um único soquete IPv6 que pode lidar com o tráfego IPv6 e IPv4. Por exemplo, um soquete de escuta TCP para IPv6 é criado, colocado no modo de pilha dupla e associado à porta 5001. Esse soquete de pilha dupla pode aceitar conexões de clientes TCP IPv6 que se conectam à porta 5001 e de clientes TCP IPv4 que se conectam à porta 5001. Esse recurso permite um design de aplicativo bastante simplificado e reduz a sobrecarga de recursos necessária para operações de postagem em dois soquetes separados. No entanto, há algumas restrições que devem ser atendidas para usar um soquete de pilha dupla. Para obter mais informações, consulte Soquetes de pilha dupla.

WSAEnumProtocols retorna duas estruturasWSAPROTOCOL_INFO para cada um dos tipos de soquete com suporte (SOCK_STREAM, SOCK_DGRAM SOCK_RAW). O iAddressFamily deve definir como AF_INET para endereçamento IPv4 e para AF_INET6 para endereçamento IPv6.

Os endereços IPv6 são descritos nas estruturas a seguir.

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 */
   };

Se um aplicativo usa funções do Windows Sockets 1.1 e deseja usar endereços IPv6, ele pode continuar a usar todas as funções antigas que usam a estrutura sockaddr como um dos parâmetros (associar, conectar, enviar e revfrom, aceitar e assim por diante). A única alteração necessária é usar sockaddr_in6 em vez de sockaddr_in.

No entanto, as funções de resolução de nomes (gethostbyname, gethostbyaddr e assim por diante) e as funções de conversão de endereço (inet_addr, inet_ntoa) não podem ser reutilizados porque pressupõem que um endereço IP tenha 4 bytes de comprimento. Um aplicativo que deseja executar a resolução de nomes e a conversão de endereços para endereços IPv6 deve usar funções específicas do Windows Sockets 2. Muitas novas funções foram introduzidas para permitir que aplicativos do Windows Sockets 2 aproveitem o IPv6, incluindo as funções getaddrinfo e getnameinfo .

Para obter mais informações sobre como habilitar recursos IPv6 em um aplicativo, consulte o Guia IPv6 para aplicativos do Windows Sockets.