VC++ с быстрой загрузки http


Я C# разработчик, не знаю много о VC++ или C++, никогда не использовал его, по некоторым причинам, которые я решил использовать с++ DLL в мое приложение для скачивания контента из интернета.

Я не хочу использовать веб-клиента.

Я хочу, чтобы загрузить HTML-контент, предоставляя URL-адрес ресурса в DLL возвращает строку ответа.

это код у меня есть до сих пор, источник

#include <iostream>
#include <string>

#include <stdlib.h>
#include <winsock.h>//dont forget to add wsock32.lib to linker dependencies

using namespace std;

#define BUFFERSIZE 1024
void die_with_error(char *errorMessage);
void die_with_wserror(char *errorMessage);

int main(int argc, char *argv[])
{
    string request;
    string response;
    int resp_leng;

    char buffer[BUFFERSIZE];
    struct sockaddr_in serveraddr;
    int sock;

    WSADATA wsaData;
    char *ipaddress = "208.109.181.178";
    int port = 80;

    request+="GET /test.html HTTP/1.0\r\n";
    request+="Host: www.zedwood.com\r\n";
    request+="\r\n";

    //init winsock
    if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
        die_with_wserror("WSAStartup() failed");

    //open socket
    if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
        die_with_wserror("socket() failed");

    //connect
    memset(&serveraddr, 0, sizeof(serveraddr));
    serveraddr.sin_family      = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
    serveraddr.sin_port        = htons((unsigned short) port);
    if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
        die_with_wserror("connect() failed");

    //send request
    if (send(sock, request.c_str(), request.length(), 0) != request.length())
        die_with_wserror("send() sent a different number of bytes than expected");

    //get response
    response = "";
    resp_leng= BUFFERSIZE;
    while (resp_leng == BUFFERSIZE)
    {
        resp_leng= recv(sock, (char*)&buffer, BUFFERSIZE, 0);
        if (resp_leng>0)
            response+= string(buffer).substr(0,resp_leng);
        //note: download lag is not handled in this code
    }

    //display response
    cout << response << endl;

    //disconnect
    closesocket(sock);

    //cleanup
    WSACleanup();
    return 0;
}

void die_with_error(char *errorMessage)
{
    cerr << errorMessage << endl;
    exit(1);
}

void die_with_wserror(char *errorMessage)
{
    cerr << errorMessage << ": " << WSAGetLastError() << endl;
    exit(1);
}

Инструкции с кодом говорит, кода закончится загрузки http 'рано', если скачать что-нибудь медленнее, чем мгновенно.

Пожалуйста, предложите лучший код, или модификаций, которые могут быть идеально подходит для использования в быстро обходчика.



641
1
задан 27 июля 2011 в 04:07 Источник Поделиться
Комментарии
1 ответ

Выше реализация не имеет никаких шансов работать. Протокол HTTP является довольно сложным, и никто из этой сложностью предполагается.

Мой совет, не тратьте время и энергию в это. Использовать высокоуровневые библиотеки.

Кроме того, используя низкоуровневый код не улучшить показатели извлечения документа через HTTP, даже если ваша реализация была молниеносной 100% полированный ассемблерный код, вам все равно придется ждать веками (от процессора точки зрения) для данных, которые приходят из сети.

7
ответ дан 27 июля 2011 в 06:07 Источник Поделиться