Помогите с получением Html файла/страницы

Тема в разделе "Общие вопросы по С и С++", создана пользователем Agrofyl, 13 сен 2008.

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

    Agrofyl Гость

    Здрасте. Хочу я скачать HTML страницу/файл. Вот так

    Код (Text):
    #include <fstream>
    #include <iostream>
    #include <windows.h>
    #include <time.h>
    #include <string>
    using namespace std;

    #pragma comment( lib, "ws2_32.lib" )

    int DownloadFile(char *charr) {

    char link[1024]="";
    strcpy(link, charr);

    char host2[1024]="", path[1024]="", filename2[1024]="";

    string str=(string)link;
    int lastslash;
    for(int i=0, nohost=1;i<=str.size(); i++) {
    if(link[i]=='/') {
    if(nohost) {
    strncpy(host2, &link[0], i);
    strncpy(path, &link[i], 1024);
    nohost=0;
    }
    lastslash=i;
    }
    }
    if(nohost) return 3;
    strncpy(filename2, &link[lastslash], 1024);
    if(filename2[0]=='/' && !filename2[1]) strcpy(filename2, "index.html");


    struct sockaddr_in server;
    struct hostent  *host = NULL;

    SOCKET sDownload = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sDownload == INVALID_SOCKET)
    {
    MessageBox(0, "Не получается создать сокет.", 0, 0);
    return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(80);
    server.sin_addr.s_addr = inet_addr(host2);

    if (server.sin_addr.s_addr == INADDR_NONE)
    {
    host = gethostbyname(host2);
    if (host == NULL)
    {
    MessageBox(0, "Невозможно опеределить IP по имени...", 0, 0);
    return 1;
    }
    CopyMemory(&server.sin_addr, host->h_addr_list[0],
    host->h_length);
    }
    if (connect(sDownload, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
    {
    MessageBox(0, "Соединиться не получилось.", 0, 0);
    return 1;
    }
    Sleep(1000);

    char zapros[4096]="";
    strcpy(zapros, "GET ");
    strcat(zapros, path);
    strcat(zapros, " HTTP/1.1\nHost: ");
    strcat(zapros, host2);
    strcat(zapros, "\nConnection: Keep-Alive\n\n");

    char filename[1024]="";
    strcpy(filename, "c:/");
    strcat(filename, filename2);

    ofstream file(filename, ios::trunc);
    strcat(filename, ".header");
    ofstream fileheader(filename);


    int ret;
    str=(string)zapros;
    ret=send(sDownload, zapros, str.size(), 0);
    if(ret == SOCKET_ERROR) return 1;

    char getbuf[1];
    int one=0, nowheader=1;
    while(1) {
    ret=recv(sDownload, getbuf, 1, 0);
    if (ret == SOCKET_ERROR) return 1;
    if(ret == 0) break;
    if(nowheader) {
    fileheader.write(getbuf, 1);
    if(getbuf[0]=='\n') {
    if(one) {
    nowheader=0;
    fileheader.flush();
    fileheader.close();
    }
    one=1;
    }
    else if(getbuf[0]!='\r') one=0;
    }
    else file.write(getbuf, 1);
    }
    file.flush();
    file.close();

    return 0;
    }

    int main() {
    WSADATA wsd;

    if(WSAStartup(MAKEWORD(2,2),&wsd) !=0) {
    cout << "WinSock do not load!" << endl;
    return 1;
    }

    char cha[]="localhost/test.html";
    int i=DownloadFile(cha);
    switch(i) {
    case 0: {
    cout << "Vse ok" << endl;
    break;
    }
    case 1: {
    cout << "System error" << endl;
    break;
    }
    case 2: {
    cout << "Error in create file" << endl;
    break;
    }
    case 3: {
    cout << "Error in link" << endl;
    break;
    }
    }
    return 0;
    }
    Но почему то вместо <html><body> получаю
    <html>

    <body>
    Что то не допру, где ошибка.
    Помогите, а.

    З.Ы. За код не пинайте, я с С++ не так давно.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей