質問

私は、64ビット版のWindows 7から32ビットのWindows(XPおよびServer 2003の場合)からいくつかのコードを移行しようとしている、と私はの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)

これまで私は、この種の問題を引き起こす可能性があるかわからないんだけどので、私は、すべてがのWinsockライブラリの正しい64ビット版にリンクされて言うことができるようによいます。

役に立ちましたか?

解決

あなたは代わりにgetaddrinfo()を使用しようとする場合があります。 ドキュメントのgethostbynameは、その使用することを指摘しの推奨され、それが今では非推奨だことを(非常によく、それにはバグがあるかもしれません)。私はあなたが持っていることを問題と任意の経験を持っていなかったが、私は、私が使用するのgetaddrinfo()は、x86およびx64上のWindows 7を通じてXP間で罰金を動作することを持っていることをコードすることを知っています。

他のヒント

そのアウトをゼロにすることであるので、

baadf00d には、初期化されていない割り当てられたヒープメモリを示すために、Microsoftが使用されていますおそらく良いアイデア。テストを確認してます。

限り、右手を高くし、低ビットを交換するなど、それが間違った場所に入れますでした。バグ?

私は、同じ問題に遭遇しました。問題は、プロジェクトの設定で、構造体メンバのアライメントオプションが4バイト(/ ZP4)に設定したということでした。私はデフォルトに、このオプションを返され、これは問題を解決します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top