[C] Blockweise Binärdatei senden über Socket zum Browser



  • 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? :

    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?



  • Du solltest nur soviel Daten mit fwrite versenden, wie du mit fread gelesen hast.

    fwrite oder fread hängt davon ab, welchen Art Filedeskriptor du verwendest.
    Zu fread, fwrite gehört das FILE von fopen .
    Bei read und write ist das ein int von open oder socket .



  • Die feof-Abfrage so wie du sie einsetzt, ist Schrott.
    Außerdem liest du immer 1024er-Blöcke ein, was passiert wenn die Datei nicht ein 1024-Vielfaches groß ist?
    Genau!
    Du schickst Schrott an deinen Empfänger.
    read/write ist kein C-Standard, fread/fwrite schon.
    Außerdem prüfst du die Rückgabewerte nicht, das ist ebenso Anfängerschrott.

    char Blockarray[1024] block;
    

    Was soll das sein? Das ist umcompilierbar.

    Baue dir eine Schleife mit fread UND Berücksichtigung der (variablen) Dateilänge und schicke die Anzahl gelesener Bytes mit write weiter, also z.B.

    char b[1024];
    size_t s;
    FILE* f = fopen(”...”,”rb”);
    
    while( s=fread(b,1,1024,f) ){
    if( -1==write(fileno(f),b,s) )
      perror("write-Fehler");
    }
    fclose(f);
    


  • Wutz schrieb:

    read/write ist kein C-Standard, fread/fwrite schon.

    Sockets gehören auch nicht zum C-Standard.



  • 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((rbytes = fread(cfile, sizeof(cfile), 1, pFile)){
    			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...



  • Du solltest richtig abschreiben können, wenn du auch das nicht kannst, ist dir nicht zu helfen.


Anmelden zum Antworten