Добрый день! Столкнулся со странностями работы функций из ws2_32.dll в 64-битном режиме. В частности при вызове функции gethostbyname() возвращается указатель на структуру hostent, указатель корректный. В структуре есть поле hostent->h_addr_list (char ** h_addr_list), которое и представляет интерес. Однако указатель на это поле содержит странное значение hostent->h_addr_list = 0x0066b6d800000000. Понятно что такого адреса памяти на компе не существует и при попытке доступа к нему программа падает. Однако если поменять местами старшую и младшую часть указателя, сделав hostent->h_addr_list = 0x000000000066b6d8, то все работает. Такую же непирятность обнаружил при мониторинге работы функции select, значение сокета получается 0x000001F800000000, хотя ожидается 0x00000000000001F8. В режиме x32 теже самые функции работают вполне корректно и возвращают ожидаемые значения. Может кто знает с чем связано такое поведение Win7 x64 и как можно эффективно решать данную проблему. спасибо!
Объявление добавленно. Собственно весь код такой: Код (Text): #pragma comment(lib,"ws2_32.lib") #include <windows.h> #include <iostream> #define _WIN64 int main(int argc, char* argv[]){ WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) return 0; hostent *hst = gethostbyname("87.250.250.11"); //yandex.ru in_addr *addr = (in_addr*)hst->h_addr_list[0]; printf("IP = %i.%i.%i.%i", addr->S_un.S_un_b.s_b1, addr->S_un.S_un_b.s_b2, addr->S_un.S_un_b.s_b3, addr->S_un.S_un_b.s_b4 ); return 0; } в результате, в структуре hst->h_addr_list = 0x00606568baadf00d
Поотлаживал посильнее, дело оказалось в банальном выравнивании структур. Выравнивание 1 байт для x64 выдает неправильные результаты.
ибо такой дефайн должен предшествовать включению виндовых хидеров, что тащемта происходит в препроцессор дефинишнс