Mehrfacher HTTP download funktioniert nicht
-
Hallo,
ich habe eine Funktion geschrieben mit der ich Dateien aus dem Internet
über nen HTTP webserver runterlade.
Wenn ich 1 Datei runterlade funkioniert es einwandfrei, sobald ich aber die Funktion ein 2tes mal aufrufe, will er mir die Datei nicht mehr runterladen.
Beim 3ten Versuch klappt es wieder. Das geht dann immer soweiter (bei den ungeraden versuchen klappts und bei den geraden nicht).Kann es sein das das der socket oder der webserver einen Moment zeit brauchen, um mich wieder zu akzeptieren?
Oder was ist mein fehler hier?Hier der code zur Funktion:
int HTTPload(struct URLPart url, char* filename) { sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { puts("Fehler beim verbinden"); return 1; } //verbinden struct sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(80); struct hostent *host = gethostbyname(url.server); if (host == NULL) { puts("Konnte IntenetAdrese nicht auflösen"); return 1; } server.sin_addr = *(struct in_addr*) host->h_addr; int res = connect(sock, (struct sockaddr*) &server, sizeof(server)); if (res < 0) { puts("Fehler beim verbinden"); return 1; } puts("Erfolgreich verbunden"); //internetseite anfordern char request[200] = "GET /"; strcat(request, url.path); strcat(request, " HTTP/1.1\nHost: "); strcat(request, url.server); strcat( request, "\nUser-Agent: Morzilla/0.4\nAccept: image/gif, image/jpeg, */*\nConnection: close\n\n"); int versuche, answer; int bufsize = strlen(request) * sizeof(char); for (versuche = 0; versuche < MAXVERSUCHE && answer != bufsize; versuche++) answer = send(sock, request, bufsize, 0); if (versuche == MAXVERSUCHE) puts("Die Anfrage konnte nicht gesendet werden"); //printf("Versuche: %d, Ubertragen: %d",versuche,answer); FILE *file; file = fopen(filename, "wb"); char buf[BUFSIZE];//10KB Speicher zum laden reservieren int final = 0; int recvBytes = 0; int ausgabe = halbMB; do { recvBytes = recv(sock, buf, BUFSIZE, 0); if (fwrite(buf, 1, recvBytes, file) != recvBytes) { fclose(file); return 1; } final += recvBytes; if (final >= ausgabe) { ausgabe += halbMB; printf("%s: %d KB Geladen\n", filename, final / 1024); } } while (recvBytes > 0); printf("Fertig: %d KB Geladen\n", final / 1024); fflush(file); fclose(file); //Schließen der verbindung res = close(sock); if (res < 0) puts("Fehler beim Schließen der Verbindung"); else puts("Verbindung erfolgreich geschlossen"); //Header löschen if (deleteHead(filename)) { puts("Fehler beim loeschen der Headerinfos"); return 1; } return 0; }
Die Ausgabe sieht dann wie folgt aus:
Erfolgreich verbunden file1.mpg: 500 KB Geladen file1.mpg: 1000 KB Geladen file1.mpg: 1501 KB Geladen file1.mpg: 2000 KB Geladen Fertig: 2190 KB Geladen Verbindung erfolgreich geschlossen Erfolgreich verbunden Fertig: 0 KB Geladen Verbindung erfolgreich geschlossen Erfolgreich verbunden 3.mpg: 500 KB Geladen 3.mpg: 1000 KB Geladen 3.mpg: 1501 KB Geladen 3.mpg: 2000 KB Geladen Fertig: 2202 KB Geladen Verbindung erfolgreich geschlossen Erfolgreich verbunden Fertig: 0 KB Geladen Verbindung erfolgreich geschlossen
MFG roskas
-
so habe nach langem suchen den Fehler gefunden.
Wenn ich int answer = 0 setze funktioniert es wunderbar.
Das Probelm war, das die Abbruchbedingung in der Schleife beim 2te,4ten usw
aufruf der Funktion schon erfüllt war und er erst gar nicht den Request String gesendet hat.Mal was anderes: wie gefällt euch mein quellcode, was kann man sollte man
anders machen oder verbessern.MFG roskas
-
strcat( request, "\nUser-Agent: Morzilla/0.4\nAccept: image/gif, image/jpeg, */*\nConnection: close\n\n");
LOL.
-
Also für ANSI-C Code erscheint mir das auf den ersten Blick ganz in Ordnung