Question

Je suis en train de migrer un code de 32 bits de Windows (XP et Server 2003) à 64 bits de Windows 7, et j'ai un problème bizarre avec gethostbyname.

Je fais quelque chose comme ceci:

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

Après l'appel à gethostbyname, le pointeur hp-> h_addr_list est invalide. Il a tous les bons chiffres, mais il ressemble à un pointeur 32 bits obtenu fourré dans le mauvais espace en quelque sorte.

Par exemple, ce que je reçois est

HP-> h_addr_list = 0x0064bdd800000000

Si j'échange manuellement la première et la dernière moitié de sorte que hp-> h_addr_list = 0x000000000064bdd8 le pointeur est valide et points aux données correctes.

Parfois, je me baadf00d au lieu de zéros trop (à savoir hp-> h_addr_list = 0x0064bdd8baadf00d),

Pour autant que je peux dire que tout est lié à la version 64 bits correcte des bibliothèques Winsock, donc je ne suis pas sûr de ce que pourrait causer ce genre de problème.

Était-ce utile?

La solution

Vous pouvez essayer d'utiliser à la place getaddrinfo(). docs pour gethostbyname indiquent que son utilisation est découragée et qu'il est maintenant dépréciée (donc il peut y avoir des bugs dedans). Je ne l'ai pas eu une expérience avec le problème que vous rencontrez mais je sais que le code que j'ai qui utilise getaddrinfo() fonctionne très bien sur XP via Windows 7 x86 et x64.

Autres conseils

baadf00d est utilisé par Microsoft pour indiquer la mémoire de tas alloué non initialisée, la mise à zéro de sorte que out probablement une bonne idée. Test pour vous assurer.

En ce qui concerne la permutation des bits haut et bas, à droite, il ne se mettre dans le mauvais endroit. Bug?

Je rencontrais la même question. Le problème est que dans les paramètres du projet l'option membre struct alignement a été réglé sur 4 octets (/ ZP4). Je suis retourné cette option par défaut et ce résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top