[c++] pobieranie strony

0

Mimo że napisałem podobny post na tym forum, dalej nie mogę sobie poradzić z pewnym zagadnieniem. Postaram się tym razem dokładnie opisać mój problem.

To tak, używam windows xp , winsock2 . Tworzę połączenie z serwerem, na którym jest plik. Wysyłam zapytanie funkcją send() o ten plik w ten sposób:

GET (sciezka) HTTP/1.1\r\n
HOST: (tu URL hosta )
Accept: */*\r\n
Accept-Language: pl\r\n
Connection: keep-alive\r\n
\r\n

Dalej w programie mam funkcję recv()
Moj problem polega na tym że nie wiem jak zapisać te dane płynące z funkcji recv(), wcześniej zapisywałem je do tablicy znakowej o określonej wielkości, ale zdarzały się przypadki że plik był większy od tablicy, a jak plik był mniejszy, to pozostała cześc tablicy zajmowała tylko niepotrzebnie miejsce. Gdybym znał wielkość pliku to można było by to zrobić za pomocą dynamicznie alokowanej tablicy, ale niestety wielkości pliku nie znam.

0

serwer www zazwyczaj w odpowiedzi wysyla najpierw serie naglowkow, potem zas dane. w naglowkach mozna sie spodziewac wpisu oznaczajacego dlugosc danych i to by Twoj problem rozwiazalo. ale.. nie wszystkie serwery zamieszczaja ten naglowek. najprosciej bedzie Ci odczytywac dane blokami i na biezaco powiekszac tablice albo na biezaco dopisywac dane na koniec pliku..

vector<char> plik(1024); //jakis-tam rozmiar na poczatek
size_t sciagnieto = 0;
vector<char>::iterator pozycja = plik.begin();
do
{   sciagnieto = recv(socket, &*pozycja, plik.end()-pozycja, 0);
     if(sciagnieto < 0)
          break; //byl blad, np. polaczenie zerwane
     pozycja += sciagnieto;
     if(pozycja == plik.end())  //jesli caly bufor pelen
          plik.resize(plik.size() + 1024);  //powiekszamy o kolejny bloczek
}while(1);

disclaimer: kod jest pogladowy.. to tylko opis idei. moze zawierac bledy

1 użytkowników online, w tym zalogowanych: 0, gości: 1