2010-01-27 176 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)。我將此選項返回到了默認值,這解決了問題。