Problema com GethostbyName em janelas de 64 bits
-
23-09-2019 - |
Pergunta
Estou tentando migrar algum código de Windows de 32 bits (XP e Server 2003) para o Windows 7 de 64 bits e estou tendo um problema estranho com o GethostbyName.
Estou fazendo algo assim:
struct hostent *hp;
hp = gethostbyname( host );
Após a chamada para GethostbyName, o ponteiro HP-> h_addr_list é inválido. Ele tem todos os números certos, mas parece que um ponteiro de 32 bits foi recheado no espaço errado de alguma forma.
Por exemplo, o que eu recebo é
hp-> h_addr_list = 0x0064bdd800000000
Se eu troquei manualmente a primeira e a última metade para que HP-> h_addr_list = 0x0000000064bdd8, o ponteiro é válido e aponta para os dados corretos.
Às vezes eu também recebo baadf00d em vez de zeros (ou seja, hp-> h_addr_list = 0x0064bdd8baadf00d),
Até onde eu sei, tudo está vinculado à versão correta de 64 bits das bibliotecas Winsock, então não tenho certeza do que poderia causar esse tipo de problema.
Solução
Você pode querer tentar usar getaddrinfo()
em vez de . o DOCs para GethostbyName aponte que seu uso é desencorajado e que está precedido agora (para que possa haver bugs nele). Não tive nenhuma experiência com o problema que você está tendo, mas sei que o código que tenho que usa getaddrinfo()
Funciona bem no XP através do Windows 7 em x86 e x64.
Outras dicas
baadf00d é usado pela Microsoft para indicar a memória alocada não inicializada, portanto, zerar isso é provavelmente uma boa ideia. Teste para ter certeza.
Quanto a trocar os bits altos e baixos, sua direita, isso foi colocado no local errado. Incomodar?
Eu encontrei o mesmo problema. O problema era que, nas configurações do projeto, a opção de alinhamento do membro da estrutura foi definida como 4 bytes (/ZP4). Devolvi esta opção para o padrão e isso resolveu o problema.