我正在尝试将一些代码从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位版本相关联,所以我不确定是什么原因导致这类问题。
答案 0 :(得分:2)
您可能想尝试使用getaddrinfo()
。 docs for gethostbyname指出不鼓励使用它,现在它已被弃用(因此可能存在错误)。我没有遇到过您遇到的问题的经验,但我知道我使用getaddrinfo()
的代码在x86和x64上通过Windows 7在XP中运行良好。
答案 1 :(得分:0)
baadf00d来表示未初始化的已分配堆内存,因此将其归零可能是一个好主意。测试以确保。
至于交换高位和低位,你的权利,它确实被置于错误的位置。错误?
答案 2 :(得分:0)
我遇到了同样的问题。问题是在项目设置中,Struct Member Alignment选项设置为4个字节(/ Zp4)。我将此选项返回到Default,这解决了问题。