Domanda

Sto provando a migrare un codice da 32 bit di Windows (XP e Server 2003) a 64-bit di Windows 7, e sto avendo un problema strano con gethostbyname.

che sto facendo qualcosa di simile:

struct hostent *hp;
hp = gethostbyname( host );

Dopo la chiamata a gethostbyname, il puntatore HP-> h_addr_list non è valido. Ha tutti i numeri giusti, ma sembra che un puntatore a 32 bit ottenuto farcito nello spazio sbagliato in qualche modo.

Per esempio, che cosa ottengo è

HP-> h_addr_list = 0x0064bdd800000000

Se sostituisco manualmente la prima e l'ultima metà in modo che HP-> h_addr_list = 0x000000000064bdd8 allora il puntatore è valido e indica i dati corretti.

A volte vengo baadf00d invece di zeri troppo (cioè HP-> h_addr_list = 0x0064bdd8baadf00d),

Per quanto posso dire tutto quello che è legato alla corretta versione a 64 bit delle librerie Winsock, quindi non sono sicuro di quello che potrebbe causare questo tipo di problema.

È stato utile?

Soluzione

Si potrebbe provare a utilizzare getaddrinfo() invece. Il documentazione per gethostbyname sottolineano che il suo utilizzo è scoraggiato e che è deprecato ora (così ci possono essere errori in esso). Non ho avuto alcuna esperienza con il problema che hai, ma so che il codice che ho che utilizza getaddrinfo() funziona bene tutta XP attraverso Windows 7 su x86 e x64.

Altri suggerimenti

baadf00d viene utilizzato da Microsoft per indicare non inizializzato memoria heap allocata, in modo che l'azzeramento fuori è probabilmente una buona idea. Test per assicurarsi.

Per quanto riguarda lo scambio dei bit alti e bassi, a destra, ha fatto diventare messo nel posto sbagliato. Bug?

Ho incontrato lo stesso problema. Il problema era che nelle impostazioni del progetto l'opzione Struct membro di allineamento è stato fissato a 4 byte (/ ZP4). Sono tornato questa opzione per default e questo risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top