2010-01-27 7 views
0

일부 코드를 32 비트 Windows (XP 및 Server 2003)에서 64 비트 Windows 7로 마이그레이션하려고하는데 gethostbyname에 이상한 문제가 있습니다.64 비트 Windows에서 gethostbyname 문제

나는 이런 식으로 뭔가를하고 있어요 :

struct hostent *hp; 
hp = gethostbyname(host); 

를 호출 한 후, 포인터 HP-> h_addr_list가 잘못되었습니다으로 gethostbyname. 그것은 모든 올바른 숫자를 가지고 있지만 32 비트 포인터가 어떻게 든 잘못된 공간에 채워진 것처럼 보입니다. 예를 들어

, 내가 무엇을 얻을

HP-> h_addr_list = 0x0064bdd800000000

입니다 HP-> h_addr_list = 0x000000000064bdd8 다음 포인터가 유효하고 포인트 있도록 내가 수동으로 첫 번째와 마지막 절반을 교체하는 경우 정확한 데이터.

는 가끔, 대신 너무 제로 (예 : HP-> h_addr_list = 0x0064bdd8baadf00d)의 baadf00d받을

지금까지 내가 모든 것이 윈속 라이브러리의 올바른 64 비트 버전에 연결되어 말할 수있는, 그래서 '으로 이런 종류의 문제를 일으키는 원인이 될지 모르겠습니다.

답변

2

대신 getaddrinfo()을 사용해 볼 수도 있습니다. docs for gethostbyname은 사용법이 권장되지 않으며 현재 사용되지 않음을 지적합니다 (따라서 버그가있을 수 있습니다). 나는 당신이 가지고있는 문제에 대한 경험이 전혀 없지만, 내가 사용하는 코드가 getaddrinfo()을 사용한다는 것은 x86과 x64에서 Windows 7을 통해 XP에서 잘 작동한다는 것을 알고 있습니다.

+0

getaddrinfo()가 나를 위해 작동하는 것처럼 보입니다. 문제가 gethostbyname에 무엇이 있는지 잘 모르겠습니다. 버그가 될 수 있습니다. – WildCrustacean

0

baadf00d은 Microsoft에서 초기화되지 않은 할당 된 힙 메모리를 나타내는 데 사용되므로 그 값을 0으로 설정하는 것이 좋습니다. 확실히 테스트하십시오.

높은 비트와 낮은 비트를 바꿔 가면서 잘못된 위치에 넣었습니다. 곤충?

0

동일한 문제가 발생했습니다. 문제는 프로젝트 설정에서 Struct Member Alignment 옵션이 4 바이트 (/ Zp4)로 설정되어 있다는 것입니다. 나는이 옵션을 Default로 되돌려 놓았고 이것으로 문제가 해결되었습니다.

관련 문제