C Blockweise Binärdatei senden über Socket zum Browser

dragonabllz

Ensign
Registriert
Mai 2011
Beiträge
254
Hi Leute,

ich versuche jetzt Blockweise eine Datei (Bilder, txt usw...) binär über einen Socket zu senden.
Ich habe eine Datei auch schon geschafft KOMPLETT zu versenden mit dynamischen Speicher, aber davon ist ja abzuraten, weil man nicht weiß wie groß die Datei ist.
Also hab ich mich bischen eingelesen und gesehen, dass man Dateien auch "Blockweise" versenden kann. Ich verstehe da aber so vieles noch nicht. Ist mein Grundgedanke so richtig: Nachdem ich die Header-Datei an den Browser gesendet habe, versende ich die Datei als Body. Das Versende sieht dann wie folgt aus:
1. Ein Array mit sagen wir mal 1024 Bytes erstellen (soll als Puffer dienen)
2. Datei öffnen mit fopen();
3. Datei einlesen in das Array mit fread() ??
4. Datei schreiben mit fwrite(); (Kann man hier auch das normale write nehmen?)
* Punkt 3 und 4 in einer Schleife laufen lassen, bis Datei komplett gesendet wurde (abfrage mit feof)

In Code wäre das so? :

Code:
char Blockarray[1024] block;
FILE* f = fopen(”...”,”rb”);

while(!feof(f)){
fread(block, sizeof(block),1,f);
fwrite(sockfd,sizeof(block),1,f);
}
Achtung: ich habe jetzt Fehler nicht abgefangen wenn z.B. die Datei nicht geöffnet werden kann oder so... das ist jetzt nur ein grober Code...

Hab ich das richtig verstanden, dass der Code dann so abläuft intern: Es werden aus der binärdatei bis 1024 Byte eingelesen, ins "block"-Array gespeichert, dann werden diese in das über den Socket an den Browser versendet. Dann widerrum wird das "block"-Array automatisch geleert??? und neue 1024Bytes eingefügt und dies solange, bis die Datei vollständig gesendet wurde?
 
Ja, aber es wird nicht "geleert" sondern überschrieben.

PS: bei MTUs von mindestens 1500 Bytes ist das keine gute Programmierung ausser der TCP Stack setzt das wieder zusammen.
 
Am ende der datei kann es zu fehlern kommen da noch alte daten im puffer sind wenn du nicht aufpasst. Senden mit fwrite? Hab ich was verpasst? Ansonsten stimmt das konzept.
 
Es will irgendwie nicht klappen.
Der Code:

Code:
        int rbytes;
        char cfile[1024];
	pFile = fopen("/home/vbox/Bilder/apfel.jpg", "rb");
	if(!pFile){
		return 0;
	}

	while(!feof(pFile)){
			if((rbytes = fread(cfile, sizeof(cfile), 1, pFile)) == -1){
				printf("Error beim Dateilesen!!");
				return;
			}
			if(write(newsockfd, cfile, rbytes) == -1){
				printf("Error beim Dateischreiben!!");
				return;
			}

		}

                    fclose(pFile);

Wenn ich die geöffnete Datei öffne und komplett in ein dynamisch erstelltes Array packe, und in einem rutsch mit write() versende klappt alles, aber so wie oben meckert der Browser, dass die Grafik nicht angezeig werden kann, da sie Fehler enthält...
 
Zuletzt bearbeitet:
Kann es sein, dass du das 2te und 3te Argument von fread vertauscht hast?
 
Oh man vielen Dank
Ergänzung ()

Oh man vielen Dank
 
Zurück
Oben