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 上的 Windows 7 上正常工作。

于 2010-01-28T10:03:22.180 回答
0

Microsoft 使用baadf00d来指示未初始化的已分配堆内存,因此将其归零可能是一个好主意。测试以确保。

至于交换高位和低位,你是对的,它确实放错了位置。漏洞?

于 2010-01-27T23:16:12.573 回答
0

I encountered the same issue. The problem was that in the project settings the Struct Member Alignment option was set to 4 bytes (/Zp4). I returned this option to Default and this resolved the issue.

于 2015-03-25T09:24:21.250 回答