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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top