Frage

Ich versuche, einige Codes von 32-Bit-Windows (XP und Server 2003) auf 64-Bit-Windows-7 zu migrieren, und ich bin ein seltsames Problem mit gethostbyname habe.

Ich bin so etwas wie dies zu tun:

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

Nach dem Aufruf von gethostbyname, der Zeiger HP-> h_addr_list ist ungültig. Es hat die richtigen Zahlen, aber es sieht aus wie ein 32-Bit-Zeiger irgendwie in den falschen Raum gestopft wurden.

Zum Beispiel, was ich erhalte, ist

HP-> h_addr_list = 0x0064bdd800000000

Wenn ich tauschen manuell die erste und die letzte Hälfte, so dass HP-> h_addr_list = 0x000000000064bdd8 dann der Zeiger gültig ist, und verweist auf die korrekten Daten.

ich auch anstelle von Nullen Manchmal erhalten baadf00d (d HP-> h_addr_list = 0x0064bdd8baadf00d)

Soweit ich sagen kann, alles auf die richtige 64-Bit-Version der Winsock-Bibliotheken verknüpft ist, so dass ich nicht sicher bin, was diese Art von Problem verursachen könnte.

War es hilfreich?

Lösung

Sie möchten stattdessen mit getaddrinfo() versuchen. Das docs für gethostbyname weist darauf hin, dass seine Nutzung wird abgeraten, und dass es jetzt veraltet ist (so kann es auch Fehler drin sein). Ich hatte keine Erfahrung mit dem Problem, dass Sie haben, aber ich weiß, dass der Code, dass ich, dass Anwendungen getaddrinfo() funktioniert gut über XP bis Windows 7 auf x86 und x64.

Andere Tipps

baadf00d wird von Microsoft verwendet, um nicht initialisierte zugewiesen Heap-Speicher anzuzeigen, so dass aus Nullstellung ist wahrscheinlich eine gute Idee. Test, um sicherzustellen.

Was die hohen und niedrigen Bits Vertauschen der rechten Seite, es hat gesetzt in der falschen Stelle bekommen. Bug?

begegnete ich das gleiche Problem. Das Problem war, dass die Struct Mitglied Alignment Option in den Projekteinstellungen auf 4 Bytes gesetzt (/ Zp4). Ich kehrte diese Option auf Standard und dies das Problem behoben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top