Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
- Adquira o utilitário Checkv4.exe. O utilitário está incluído no Microsoft Windows Software Development Kit (SDK).
- 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.
- 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.
- 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.
Tópicos relacionados
-
Guia IPv6 para aplicativos Windows Sockets
-
chamadas de funções para aplicativos que utilizam Winsock para IPv6
-
Problemas de interface do usuário para aplicativos Winsock IPv6