我试图从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),

据我可以告诉一切都被链接到winsock的库的正确的64位版本,所以我不知道什么可能会导致这样那样的问题。

有帮助吗?

解决方案

您可能需要使用getaddrinfo()而尝试。该文档进行的gethostbyname 指出的是,它的用法不鼓励,并且它现在弃用(所以有可能是错误的话)。我还没有与你有,但我知道的代码,我有一个使用getaddrinfo()可以跨XP精细通过Windows 7 x86和x64问题的经验。

其他提示

baadf00d 是使用微软以指示未初始化分配的堆存储器中,从而归零表示出来是可能是一个好主意。测试以确保。

至于交换高低位,你的权利,但没有得到放进错误的地方。错误?

我遇到了同样的问题。问题是,在项目设置为结构成员对齐选项设置为4个字节(/ ZP4)。我回到这个选项为默认,这解决了问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top