Проблема с gethostbyname в 64-разрядной версии Windows
-
23-09-2019 - |
Вопрос
Я пытаюсь перенести некоторый код из 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, поэтому я не уверен, что могло вызвать такого рода проблему.
Решение
Возможно, вы захотите попробовать использовать getaddrinfo()
вместо этого .В документы для gethostbyname укажите, что его использование не рекомендуется и что сейчас он устарел (так что в нем вполне могут быть ошибки).У меня не было никакого опыта в решении проблемы, с которой вы столкнулись, но я знаю, что имеющийся у меня код использует getaddrinfo()
отлично работает в XP и Windows 7 на x86 и x64.
Другие советы
baadf00d ( баадф00д ) используется Microsoft для обозначения неинициализированной выделенной памяти кучи, поэтому обнуление этого параметра, вероятно, является хорошей идеей.Проверьте, чтобы убедиться.
Что касается замены высоких и низких разрядов, ваше право, это действительно было поставлено не в то место.Ошибка?
Я столкнулся с той же проблемой.Проблема заключалась в том, что в настройках проекта параметру Выравнивания элементов структуры было присвоено значение 4 байта (/Zp4).Я вернул этому параметру значение по умолчанию, и это решило проблему.