0

一部のコードを 32 ビット Windows (XP および Server 2003) から 64 ビット Windows 7 に移行しようとしていますが、gethostbyname で奇妙な問題が発生しています。

私はこのようなことをしています:

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

gethostbyname の呼び出し後、ポインター hp->h_addr_list が無効になります。数値はすべて正しいのですが、32 ビット ポインターが何らかの形で間違ったスペースに詰め込まれたようです。

たとえば、私が得るものは

hp->h_addr_list = 0x0064bdd800000000

hp->h_addr_list = 0x000000000064bdd8 となるように前半と後半を手動で交換すると、ポインターは有効になり、正しいデータを指します。

ゼロの代わりに baadf00d を取得することもあります (つまり、hp->h_addr_list = 0x0064bdd8baadf00d)。

私が知る限り、すべてが正しい 64 ビット バージョンの winsock ライブラリにリンクされているため、この種の問題の原因はわかりません。

4

3 に答える 3

2

getaddrinfo()代わりにを使用してみてください。gethostbynameのドキュメントは、その使用は推奨されておらず、現在は推奨されていないことを指摘しています (そのため、バグがある可能性があります)。あなたが抱えている問題の経験はありませんが、getaddrinfo()x86 および x64 上の XP から Windows 7 まで、私が使用するコードが正常に動作することは知っています。

于 2010-01-28T10:03:22.180 に答える
0

baadf00dは、初期化されていない割り当てられたヒープ メモリを示すために Microsoft によって使用されるため、それをゼロにすることはおそらく良い考えです。確認するためにテストします。

上位ビットと下位ビットを交換する限り、あなたの正しい、それは間違った場所に置かれました。バグ?

于 2010-01-27T23:16:12.573 に答える
0

同じ問題が発生しました。問題は、プロジェクト設定で、Struct Member Alignment オプションが 4 バイト (/Zp4) に設定されていたことです。このオプションをデフォルトに戻し、これで問題が解決しました。

于 2015-03-25T09:24:21.250 に答える