Проблема с gethostbyname в 64-битной Windows - PullRequest
0 голосов
/ 28 января 2010

Я пытаюсь перенести некоторый код из 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, поэтому я не уверен, что может вызвать такую ​​проблему.

Ответы [ 3 ]

2 голосов
/ 28 января 2010

Возможно, вы захотите попробовать вместо этого getaddrinfo(). Документы для gethostbyname указывают на то, что его использование не рекомендуется и что оно устарело (поэтому в нем вполне могут быть ошибки). Я не имел никакого опыта в решении проблемы, с которой вы сталкиваетесь, но я знаю, что код, который у меня есть, который использует getaddrinfo(), отлично работает на XP через Windows 7 на x86 и x64.

0 голосов
/ 25 марта 2015

Я столкнулся с той же проблемой. Проблема заключалась в том, что в настройках проекта параметр выравнивания элементов Struct был установлен на 4 байта (/ Zp4). Я вернул этот параметр по умолчанию, и это решило проблему.

0 голосов
/ 28 января 2010

baadf00d используется Microsoft для указания неинициализированной выделенной памяти кучи, так что обнуление этого, вероятно, хорошая идея. Проверьте, чтобы убедиться.

Что касается обмена старшими и младшими битами, то, правильно, они оказались не в том месте. Ошибка?

...