проблема Адресации в Win7 x64

Тема в разделе "WASM.X64", создана пользователем alkubik, 14 фев 2012.

  1. alkubik

    alkubik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2012
    Сообщения:
    3
    Добрый день!

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

    спасибо!
     
  2. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    объявления типа _WIN64 не забыл в препроцессор добавить?
     
  3. alkubik

    alkubik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2012
    Сообщения:
    3
    Объявление добавленно. Собственно весь код такой:
    Код (Text):
    1. #pragma comment(lib,"ws2_32.lib")
    2. #include <windows.h>
    3. #include <iostream>
    4.  
    5. #define _WIN64
    6.  
    7. int main(int argc, char* argv[]){  
    8.    
    9.     WSADATA wsaData;
    10.  
    11.     if (WSAStartup(MAKEWORD(2, 2), &wsaData))
    12.         return 0;
    13.    
    14.     hostent *hst = gethostbyname("87.250.250.11");  //yandex.ru
    15.     in_addr *addr = (in_addr*)hst->h_addr_list[0];
    16.  
    17.     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 );
    18.  
    19.     return 0;
    20. }
    в результате, в структуре hst->h_addr_list = 0x00606568baadf00d
     
  4. alkubik

    alkubik New Member

    Публикаций:
    0
    Регистрация:
    14 фев 2012
    Сообщения:
    3
    Поотлаживал посильнее, дело оказалось в банальном выравнивании структур. Выравнивание 1 байт для x64 выдает неправильные результаты.
     
  5. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    ибо такой дефайн должен предшествовать включению виндовых хидеров, что тащемта происходит в препроцессор дефинишнс