C++ и получение страницы по HTTP.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by m0Hze, 17 Jun 2009.

  1. m0Hze

    m0Hze Elder - Старейшина

    Joined:
    1 Nov 2008
    Messages:
    266
    Likes Received:
    644
    Reputations:
    208
    Собственно недавно открыл учебник по C++, прочитал,показалось достаточно нетяжело,но вот возник вопрос по работе с сетью.А именно - получением информации по средству http.Статей для моего уровня знаний не нашол.
    И так, нужен простейший код соединения с http и принятием информации.Тоесть.
    url = "antichat.ru";
    .....
    и наприер в переменной content остаеться всен содержимое страницы.
    Скрипт нужен только для изучения.Если нужны стоонние класы или библиотеки,пожалуйста с названием.И если таковая имееться - литература по ним.Спасибо.
     
    4 people like this.
  2. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    Посмотри темой ниже, только что там отписал)
    https://forum.antichat.ru/thread125744.html

    Насчет литературы - http://msdn.microsoft.com/en-us/library/ms741394(VS.85).aspx
     
    #2 d_x, 17 Jun 2009
    Last edited: 17 Jun 2009
    1 person likes this.
  3. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    Code:
    #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();
        }
     
  4. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    А нахрена юзать апи, когда есть классы-обертки? Количество кода сократится в десяток раз.
     
  5. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    afxinet.h ?)))
     
  6. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    в вижуал есть. только если ты делаешь на чистом win32 проекте без мфц, то это просто редактор. Если проект мфц - то код опять же упрощается. Выбираешь обрабатываемое событие или сообщение, добавляешь обработчик, указываешь, в какой класс засунуть обработчик и все. Но советую начать с обычных вин32 окошек. Ибо горе делфи не учит работе системы. Учит тока растянуть батон тут, клацнуть там.
    Чтобы создалось простое окно делаешь в студии проект вин32 не емпти и не консольный. Открываешь меню view->resource view. Там в дереве dialogs и вперед. Основное окно создается на апи, эбаут создается на шаблоне из ресурсов. Основное окно тоже может быть из ресурсов и создаваться через DialogBox. Советую глянуть firststeps.ru так вроде были основы. И мсдн побольше читай
     
    1 person likes this.
  7. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну вообще суть с++ не в гуи =) для начала стоит научиться использовать ооп. создавать классы, распределять по ним методы, фтыкнуть полиморфизм и наследование. идеально для этого подходит консольное приложение. реши, чего именно ты хочешь добиться. писать на с++ или просто окошки на с++ делать? если первое - то почитай дейтела "как программировать на с++". если второе - то не советую для этого изучать с++ =) очень быстро поймешь, что с++ несколько отличается от того же делфи. тут нада все таки продумывать архитектуру программ, да и управление памятью по началу без опыта будет давать кучу проблем.
    по гуям есть смысл почитать "Win32 API. Разработка приложений для Windows" Щупак Ю.
     
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,118
    Reputations:
    1,139
    Диалог бокс!
     
  9. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    А я бы не советовал читать Щупака, гораздо лучше - Рихтера
     
  10. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    рихтер на другом фокусирует внимание.
     
  11. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    может сначала стоит поискать в гугле ? а не спрашивать как вывести текст, как сделать то и то, все это хорошо гуглится уже миллион статей написано по данному сабжу.
     
  12. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    1 person likes this.
Loading...