Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top