2010-01-27 174 views
0

我试图将一些代码从32位Windows(XP和Server 2003)迁移到64位Windows 7,并且出现了gethostbyname的奇怪问题。在64位Windows上使用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位版本,所以我我不确定可能会导致这种问题。

回答

2

您可能想尝试使用getaddrinfo()来代替。 docs for gethostbyname指出,它的使用是不鼓励的,现在它已被弃用(所以它可能有错误)。我对您遇到的问题没有任何经验,但我知道我使用的代码getaddrinfo()可以在x86和x64上通过Windows 7在XP上正常工作。

+0

getaddrinfo()似乎在为我工作,我不确定gethostbyname的问题是什么,它很可能只是一个错误。 – WildCrustacean 2010-01-28 15:04:35

0

baadf00d被微软用来指示未初始化的已分配堆内存,因此调零是一个好主意。测试以确保。

至于交换高位和低位,你的权利,它确实得到了错误的地方。错误?

0

我遇到了同样的问题。问题是在项目设置中,“结构成员调整”选项设置为4字节(/ Zp4)。我将此选项返回到了默认值,这解决了问题。