Hostent структура. Получение элементов списков.

Тема в разделе "WASM.NETWORKS", создана пользователем NoName, 6 окт 2004.

Статус темы:
Закрыта.
  1. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Вариант 1. Если указан "domain name".
    Код (Text):
    1. mov eax,offset ServerName
    2. push eax
    3. call gethostbyname
    4. cmp eax,0
    5. je NotFoundInDNS
    6. mov eax,(_hostent ptr [eax]).h_addr_list
    7. mov eax,[eax]
    8. push dword ptr [eax]
    9. call inet_ntoa


    После этого в eax регистре имеем стандартный десятично-точечный вид IP адреса.





    Вариант 2. Указан IP.
    Код (Text):
    1. push offset ServerIP
    2. call inet_addr ;try to convert IPv4 -> NetByteType
    3. cmp eax,-1
    4. je NOTIP       ;domain name -> IP
    5. mov iad.S_un.S_addr,eax
    6. invoke gethostbyaddr,offset iad, sizeof iad, AF_INET
    7. cmp eax,0
    8. je NotFoundInDNS_G
    9. invoke wsprintf,addr SD,addr StrFormat,(_hostent ptr [eax]).h_name
    10. push offset dword ptr [SD]
    11. "call something"
    12.  


    Получили соответственно домен интересующего нас сервера.



    Я хотел бы получить:

    1. "альтернативные имена узла (массив строк)" (Касперский (С)). Поле h_aliases.

    2. список альтернативных IP. Поле h_addr_list.



    Пытаюсь по всякому писать [...+sizeof(DWORD)]

    Но фигушки! Неполучается.
     
  2. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Может быть кто-нибудь все-таки ответит на мой вопрос.

    Кто умнее здесь из всех в сетях?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    NoName

    Примерно так
    Код (Text):
    1. ...
    2. ; получить указатель на hostent
    3.     invoke  gethostbyaddr, ...
    4. ; или
    5.     invoke  gethostbyname, ....
    6.     test    eax,eax
    7.     jz  short gethostby_error
    8.  
    9.     push    eax
    10.  
    11.     mov eax,(_hostent ptr [eax]).h_aliases
    12.     test    eax,eax
    13.     jz  short h_aliases_done
    14. h_aliases_get:
    15.     mov ecx,[eax]
    16.     test    ecx,ecx
    17.     jz  short h_aliases_done
    18.     push    eax
    19. ;
    20. ; здесь ECX содержит адрес очередного псевдонима
    21. ; например, его можно вывести на консоль при помощи
    22. ;
    23.     push    eax     ; буфер для NumberOfCharsWritten
    24.     push    0       ; lpReserved
    25.     lea eax,[esp+4]
    26.     push    eax     ; lpNumberOfCharsWritten
    27.     push    ecx     ; сохранить адрес строки с псевдонимом
    28.     push    ecx
    29.     call    lstrlenA    ; определить длину строки с псевдонимом
    30.     pop ecx     ; восстановить адрес строки с псевдонимом
    31.     push    eax     ; nNumberOfCharsToWrite
    32.     push    ecx     ; pBuffer
    33.     push    STD_OUTPUT_HANDLE
    34.     call    GetStdHandle
    35.     push    eax     ; hConsoleOutput
    36.     call    WriteConsoleA
    37.     pop eax     ; восстановить стек от NumberOfCharsWritten
    38.  
    39.     pop eax
    40.     add eax,sizeof dword
    41.     jmp short h_aliases_get
    42. h_aliases_done:
    43.  
    44.     pop eax
    45.  
    46.     mov eax,(_hostent ptr [eax]).h_addr_list
    47.     test    eax,eax
    48.     jz  short h_addr_list_done
    49. h_addr_list_get:
    50.     mov ecx,[eax]
    51.     test    ecx,ecx
    52.     jz  short h_addr_list_done
    53.     push    eax
    54. ;
    55. ; здесь ECX содержит адрес очередного ip-адреса
    56. ; например, его можно перевести в строку при помощи
    57. ;
    58.     push    dword ptr [ecx]
    59.     call    inet_ntoa
    60.  
    61.     pop eax
    62.     add eax,sizeof dword
    63.     jmp short h_addr_list_get
    64. h_addr_list_done:
    65. ...
    PS imho знания в сетях здесь ни при чем.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    2 q_q

    Спасибо.
     
Статус темы:
Закрыта.