Hallo,
ich suche mich seit einigen Tagen durch das Internet und finde immer noch nichts, was mir richtig hilft.
Mein Ziel ist es, eine Binärdatei (in dem Fall eine .exe) über HTTP herunterzuladen und in einer Datei zu speichern. Die Originaldatei ist etwa 12 MB groß.
Den nötigen Request speichere ich in einem char-Array (buffer), das eine größe von 1024 Feldern hat:
Der Empfang wird dann folgendermaßen vollzogen (char buffer[1024] und (std:
string response):
Der Empfang funktioniert, ich bekomme angezeigt, dass gerundet 12 MB empfangen wurden (die Zeile cout <<"empfangen: " << gesamtb << endl; gibt das jedenfalls so aus).
Nach der Schleife wird noch einmal die Funktion schreibe_daten("testprogramm.exe", response) aufgerufen, damit auch alle Daten geschrieben werden.
Die Funktion ist bei mir so implementiert:
Die auskommentierten Zeilen zeigen meinen ersten Versuch, ich dachte die Alternative mit dem <<-Operator würde vielleicht funktionieren.
Aber es werden nur etwas mehr als 3MB übertragen und ich komme nicht weiter.
Da der Empfang mir tatsächlich die ~12MB anzeigt, gehe ich davon aus, dass ich die Filestreams falsch benutze.
Findet jemand einen (Logik-)Fehler?
Danke schonmal im voraus![Smile :) :)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
PS: der HTTP-Header wird bis dato noch mit in die Datei geschrieben, aber daran wird es wohl nicht liegen oder?
ich suche mich seit einigen Tagen durch das Internet und finde immer noch nichts, was mir richtig hilft.
Mein Ziel ist es, eine Binärdatei (in dem Fall eine .exe) über HTTP herunterzuladen und in einer Datei zu speichern. Die Originaldatei ist etwa 12 MB groß.
Den nötigen Request speichere ich in einem char-Array (buffer), das eine größe von 1024 Feldern hat:
Code:
strcpy(buffer,"GET /~home/testprogramm.exe HTTP/1.0\r\nUser-agent: http-download\r\n\r\n");
Code:
bytes = recv(s,buffer,BUFFER_SIZE,0);
while(bytes > 0){
gesamtb = gesamtb + bytes;
cout <<"empfangen: " << gesamtb << endl;
response += buffer;
if(response.size() >= BUFFER_SIZE*2){
schreibe_daten("testprogramm.exe",response);
response.clear();
}
bytes = recv(s,buffer,BUFFER_SIZE,0);
}
Nach der Schleife wird noch einmal die Funktion schreibe_daten("testprogramm.exe", response) aufgerufen, damit auch alle Daten geschrieben werden.
Die Funktion ist bei mir so implementiert:
Code:
void schreibe_daten(string dateiname, string data){
ifstream testedatei;
testedatei.open(dateiname.c_str(),ios_base::in);
if(testedatei.good()){
testedatei.close();
ofstream ausgabe_datei;
ausgabe_datei.open(dateiname.c_str(),fstream::out | fstream::binary | fstream::app);
//ausgabe_datei.write(data.data(),sizeof(data.data()));
ausgabe_datei << data.data();
ausgabe_datei.close();
}
else {
testdatei.close();
cout << "Datei wird angelegt... " << endl;
ofstream anlege_datei;
anlege_datei.open(dateiname.c_str(),fstream::out | fstream::binary);
//anlege_datei.write(data.data(),sizeof(data.data()));
anlege_datei << data.data();
anlege_datei.close();
}
}
Aber es werden nur etwas mehr als 3MB übertragen und ich komme nicht weiter.
Da der Empfang mir tatsächlich die ~12MB anzeigt, gehe ich davon aus, dass ich die Filestreams falsch benutze.
Findet jemand einen (Logik-)Fehler?
Danke schonmal im voraus
PS: der HTTP-Header wird bis dato noch mit in die Datei geschrieben, aber daran wird es wohl nicht liegen oder?