【问题标题】:Issue with gethostbyname on 64-bit Windows64 位 Windows 上的 gethostbyname 问题
【发布时间】:2010-01-27 23:09:33
【问题描述】:

我正在尝试将一些代码从 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 库,所以我不确定是什么导致了这种问题。

【问题讨论】:

    标签: 64-bit winsock winsock2 gethostbyname


    【解决方案1】:

    您可能想尝试改用getaddrinfo()docs for gethostbyname 指出不鼓励使用它并且现在已弃用(因此其中可能存在错误)。我对您遇到的问题没有任何经验,但我知道我拥有的使用 getaddrinfo() 的代码在 x86 和 x64 上的 Windows 7 中可以正常工作。

    【讨论】:

    • getaddrinfo() 似乎对我有用,我不确定 gethostbyname 的问题是什么,它很可能只是一个错误。
    【解决方案2】:

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

    至于交换高位和低位,没错,它确实放错了位置。错误?

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。问题是在项目设置中,Struct Member Alignment 选项设置为 4 个字节 (/Zp4)。我将此选项恢复为默认值,这解决了问题。

      【讨论】:

        猜你喜欢
        • 2011-12-12
        • 1970-01-01
        • 2011-04-01
        • 1970-01-01
        • 2013-06-06
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        相关资源
        最近更新 更多