Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   C++ и получение страницы по HTTP. (https://forum.antichat.xyz/showthread.php?t=125776)

m0Hze 17.06.2009 21:27

C++ и получение страницы по HTTP.
 
Собственно недавно открыл учебник по C++, прочитал,показалось достаточно нетяжело,но вот возник вопрос по работе с сетью.А именно - получением информации по средству http.Статей для моего уровня знаний не нашол.
И так, нужен простейший код соединения с http и принятием информации.Тоесть.
url = "antichat.ru";
.....
и наприер в переменной content остаеться всен содержимое страницы.
Скрипт нужен только для изучения.Если нужны стоонние класы или библиотеки,пожалуйста с названием.И если таковая имееться - литература по ним.Спасибо.

d_x 17.06.2009 21:31

Посмотри темой ниже, только что там отписал)
https://forum.antichat.ru/thread125744.html

Насчет литературы - http://msdn.microsoft.com/en-us/library/ms741394(VS.85).aspx

s_p_a_m 17.06.2009 21:35

Код:

#include <windows.h>

#include <stdio.h>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")

char* OpenURL(char *url) {
    WSADATA lpWSAData;
    SOCKET s;

    // Проверим на правильность введенный адрес.
    // Он должен начинаться с "http://"
    if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(NULL);
    url+=7;

    // Инициализация библиотеки Ws2_32.dll.
    if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(NULL);


    // Получим имя хоста, номер порта и путь ----------------------------

    char *http_host=strdup(url); // Имя хоста (HTTP_HOST)
    int port_num=80;            // Номер порта по умолчанию (HTTP_PORT)
    char *http_path=NULL;        // Путь (REQUEST_URI)

    char *pch=strchr(http_host,':');
    if (!pch) {
        pch=strchr(http_host,'/');
        if (pch) {
            *pch=0;
            http_path=strdup(pch+1);
            }
        else http_path=strdup("");
        }
    else {
        *pch=0;pch++;
        char *pch1 = strchr(pch,'/');
        if (pch1) {
            *pch1=0;
            http_path=strdup(pch1+1);
            }
        else http_path=strdup("");

        port_num = atoi(pch);

        if (port_num==0) port_num = 80;
        }

    // Поучаем IP адрес по имени хоста
    struct hostent* hp;
    if (!(hp=gethostbyname(http_host))) {
        free(http_host);
        free(http_path);
        return(NULL);
        }

    // Открываем сокет
    s=socket(AF_INET, SOCK_STREAM, 0);
    if (s==INVALID_SOCKET) {
        free(http_host);
        free(http_path);
        return(NULL);
        }

    // Заполняем структуру sockaddr_in
    struct sockaddr_in ssin;
    memset ((char *)&ssin, 0, sizeof(ssin));
    ssin.sin_family = AF_INET;
    ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
    ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
    ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
    ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
    ssin.sin_port = htons(port_num);

    // Выводим IP адрес хоста, с которым будем соединятся
    printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0],
                                        (unsigned char)hp->h_addr[1],
                                        (unsigned char)hp->h_addr[2],
                                        (unsigned char)hp->h_addr[3]);

    // Соединяемся с хостом
    if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) {
        free(http_host);
        free(http_path);
        printf("Error\n");
        return(NULL);
        }
    printf("Ok\n");

    // Формируем HTTP запрос
    char *query=(char*)malloc(2048);

    strcpy(query,"GET /");
    strcat(query,http_path);
    strcat(query," HTTP/1.0\nHost: ");
    strcat(query,http_host);
    strcat(query,"\nUser-agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
    strcat(query,"\nAccept: */*\n\n");


    // Выводим HTTP запрос
    printf("%s",query);

    // Отправляем запрос серверу
    int cnt=send(s,query,strlen(query),0);

    // Освобождаем память
    free(http_host);
    free(http_path);
    free(query);

    // Проверяем, не произошло ли ошибки при отправке запроса на сервер
    if (cnt==SOCKET_ERROR) return(NULL);

    cnt=1;

    // Получаем ответ с сервера ---------------------------------

    int size=1024*1024; // 1Mb
    char *result=(char*)malloc(size);
    strcpy(result,"");
    char *result_ptr=result;

    while (cnt!=0 && size>0) {
        cnt=recv (s, result_ptr, sizeof(size),0);
        if (cnt>0) {
            result_ptr+=cnt;
            size-=cnt;
            }
        }
    *result_ptr=0;

    // Деинициализация библиотеки Ws2_32.dll
    WSACleanup();

    return(result);
    }

void main(void) {
    char *result=OpenURL("http://www.antichat.ru/");
    if (result) {
        printf("%s",result);
        free(result);
        }
    else {
        printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
        }
        getchar();
        getchar();
    }


m0Hze 17.06.2009 21:38

Всем спасибо,совсем забыл про wins. :)

nerezus 17.06.2009 21:46

А нахрена юзать апи, когда есть классы-обертки? Количество кода сократится в десяток раз.

[n]-c0der 17.06.2009 21:53

afxinet.h ?)))

m0Hze 18.06.2009 00:56

Цитата:

Сообщение от nerezus
А нахрена юзать апи, когда есть классы-обертки? Количество кода сократится в десяток раз.

Нер, нука подкинь почитать что нибудь про "классы обертки", я знаю у тебя все есть =)

m0Hze 18.06.2009 01:03

Вот,люди,пока не забыл,задам наиглупейший но очень меня волнующий вопрос.
Как в C++ прорисовываеться интерфейс у программы под win32? Прописываеться кодом каждая кнопка и окошко Просто я недалеко зашел,но успел увидить,что привычной для меня в Dekphi панели кнопочек,окошечек,боксов - нет :( С++ Игшдвук edbltk - tcnm?f d С++ (Visual) - нет =*(

Ra$cal 18.06.2009 01:19

в вижуал есть. только если ты делаешь на чистом win32 проекте без мфц, то это просто редактор. Если проект мфц - то код опять же упрощается. Выбираешь обрабатываемое событие или сообщение, добавляешь обработчик, указываешь, в какой класс засунуть обработчик и все. Но советую начать с обычных вин32 окошек. Ибо горе делфи не учит работе системы. Учит тока растянуть батон тут, клацнуть там.
Чтобы создалось простое окно делаешь в студии проект вин32 не емпти и не консольный. Открываешь меню view->resource view. Там в дереве dialogs и вперед. Основное окно создается на апи, эбаут создается на шаблоне из ресурсов. Основное окно тоже может быть из ресурсов и создаваться через DialogBox. Советую глянуть firststeps.ru так вроде были основы. И мсдн побольше читай

m0Hze 18.06.2009 02:06

2Ra$cal.
на первыхшагах очень унылые и плоховатые уроки.Ничего не сбалансированно,объяснени все теоретические.Вот еслибы бы было чтото такое же,только получше сделанное - было бы отлично.А то книжка многое не объясняет,а про ГУИ я вооббще там ничего не нашол :(


Время: 03:08