Kmitska hat geschrieben:Also Leute, habe es jetzt so gemacht, wie Ihr es mir gesagt habt...
Glaube ich nicht, aber es klingt erstmal richtig ;-D
Code: Alles auswählen
void downloadFile( string server, string file )
{
Socket client;
client.create();
client.connect(server, 80);
client.send("GET " + file + " HTTP/1.1\r\n");
client.send("Host: " + server + "\r\n\r\n");
char* response = new char[1024];
client.c_recv(*response);
ofstream nFile("image.PNG", std::ios::out | std::ios::binary | std::ios::ate );
for(short i=0; i<=(30308/1024); i++){
memset(response, 0, strlen(response)+1);
client.c_recv(*response);
nFile.write(response, strlen(response));
}
nFile.write("\0", 1);
delete [] response;
}
[/quote]
Wenn ich mir den Code so angucke, wird Deine Datei kleiner als 30208 sein.
Offenbar hast Du immernoch nicht verstanden, dass es einen Unterschied zwischen Binärsten und Strings gibt. Binärdaten können 0 enthalten, Strangs nicht. strlen() prüft, wann die 0 kommt, die einen String beendet. Nochmal: In Binärdaten sind häufig 0len drin.
Also muss Dein c_recv auch eine Länge zurückliefen, wieviele Daten überhaupt gelesen wurden.
Hier haben String-Funktionen nirgendwo irgendwas zu suchen und am Ende der Binären Datei gehört auch kein zusätzliches Nullbyte.
Die Socket-Klasse - wo hast Du die geklaut? Bevor Du Klassen von anderen benutzt, solltest Du idealerweise verstehen, was Du tust. Da Du den Unterschied zwischen Strangs und Binärdaten noch nicht kennst, glaube ich nicht, dass Du verstehest, was in der Socket-Klasse vor sich geht.
Du versuchst Dinge ans Laufen zu bekommen, die Du noch nicht verstehst. Das wird sehr viele Fehler verursachen. Wer einen Berg besteigen will, sollte nicht mit dem Gipfel anfangen, der erste Schritt beginnt am Grund des Berges. Ohne gutes Fundament wirst Du laufend abstürzen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.