Как правильно отправить запрос на WEB страницу

Тема в разделе "WASM.NETWORKS", создана пользователем assch, 19 авг 2017.

  1. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Для примера есть ссылка

    www.jose.it-berater.org/gdiplus/reference/aboutgdiplus.htm

    если посмотреть через сниффер то когда браузер активирует ссылку
    проходит пакет запроса

    Протокол - TCP
    Удалённый порт - 80
    Служба - http

    Протокол пакета состоит из двух элементов
    это стартовая строка и заголовки

    Код (ASM):
    1. GET /gdiplus/reference/aboutgdiplus.htm HTTP/1.1
    2. Host: www.jose.it-berater.org
    3. Connection: keep-alive
    4. Upgrade-Insecure-Requests: 1
    5. User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.1 Iron Safari/537.36
    6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    7. Accept-Encoding: gzip, deflate, sdch
    8. Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
    В ответ сервер присылает протокол из трёх элементов
    это стартовая строка заголовки и тело сообщения
    в этом теле сообщения прописан HTML код запрашиваемой страницы
    Всю работу по обмену пакетами под капотом выполняет браузер
    А как эту же работу сделать при помощи кода
    Например программа минимум:
    как правильно отправить запрос и получить в ответ HTML код
    Первое что нужно сделать как мне кажется это в глобальном сегменте
    создать текстовый буфер запроса серверу и если я не ошибаюсь
    в конце нужно добавить лишний пустой переход строки

    Код (ASM):
    1. .data
    2. szGet\
    3. db "GET /gdiplus/reference/structures/bitmapdata.htm HTTP/1.1",13,10
    4. db "Host: www.jose.it-berater.org",13,10
    5. db "Connection: keep-alive",13,10
    6. db "Upgrade-Insecure-Requests: 1",13,10
    7. db "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2950.1 Iron Safari/537.36",13,10
    8. db "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",13,10
    9. db "Accept-Encoding: gzip, deflate, sdch",13,10
    10. db "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4",13,10
    11. db 13,10,0
    12. .code
    Объявить стуктуру - WSADATA
    и провести инициализацию библиотеки

    Код (ASM):
    1. .data?
    2. wsd WSADATA <>
    3. .code
    4. invoke WSAStartup,0202h,addr wsd
    Создать сокет

    Код (ASM):
    1. .data
    2. sock dword 0
    3. .code
    4. invoke socket,AF_INET,SOCK_STREAM,0
    5. mov sock,eax
    Обьявить структуру - sockaddr_in
    и заполнить её

    Код (ASM):
    1. .data?
    2. saddr sockaddr_in <>
    3. .code
    4. mov saddr.sin_family,AF_INET
    5. mov saddr.sin_port,80
    6. mov saddr.sin_addr,???????????
    7. mov saddr.sin_zero,0
    во второй параметр структуры поставил число - 80
    но честно говоря не знаю правильно ли я сделал
    третий параметр структуры вообще не знаю как и чем заполнить
    потом вродебы должны идти функции

    Код (ASM):
    1. invoke bind,sock,addr saddr,sizeof saddr
    2. invoke connect,sock,addr saddr,sizeof saddr
    В конце я так полагаю отправка данных по сокету

    Код (ASM):
    1. invoke lstrlenA,addr szGet
    2. invoke send,sock,addr szGet,eax,0
    Кто в теме подскажите пожалуйста как синтаксически правильно
    заполнить стуктуру - sockaddr_in
    и послать запрос по этому адресу

    www.jose.it-berater.org/gdiplus/reference/aboutgdiplus.htm

    чтобы сервер нам прислал ответ
    а как обработать ответ это уже программа максимум
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    Если протокол TCP , то почему не указан

    надо так
    Код (ASM):
    1. invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
    можно конечно указать 0, и подсистема сама выберет - но лучше делать четко.

    далее вначале очищаем saddr. Или заранее заполняем ее нулями, например так
    Код (ASM):
    1. saddr db sizeof(sockaddr_in) dup (0)
    далее, порт вы не правильно сделали, надо так:
    Код (ASM):
    1. invoke htons,80
    2. mov saddr.sin_port, ax
    далее заполняем
    Код (ASM):
    1. mov saddr.sin_family,AF_INET
    далее вам надо получить адрес, для этого используется функция gethostbyname
    Результирующая структура hostent содержит нужную инфу, которую нужно поместить в поле sin_addr
    Код (ASM):
    1. invoke    gethostbyname,offset host_name
    2. or    eax,eax
    3. jz    _err
    4.  
    5. assume    eax:ptr hostent
    6. mov    ebx,[eax].h_list
    7. mov    ebx,[ebx]
    8. mov    ebx,[ebx]
    9. mov    saddr.sin_addr,ebx
    если по IP то нужно использовать gethostbyaddr

    Ну и конечно не надо биндить (bind) порт. Вы же клиент делаете, а не сервер
     
    assch нравится это.
  3. assch

    assch Member

    Публикаций:
    0
    Регистрация:
    17 мар 2011
    Сообщения:
    192
    Большое спасибо за подсказки