Datei von Server an Client schicken



  • Hallo,

    ich habe eine Aufgabe und will nur wissen ob mein Gedankengang richtig ist bzw. ob ihr es anders machen würdet:

    Folgendes Szenario: Der Client gibt einen Dateinamen an, der dann am Server gesucht wird. Ist die Datei vorhanden, soll sie blockweise über den Socket übertragen werden und im Client Verzeichnis gespeichert werden.

    so nun dazu wie ich es machen würde:

    Zuerst mal Dateinamen eingeben, der dann zum Server gesendet wird. Server empfängt den Namen und sucht nach dem Dateinamen. Danach öffne ich die Datei, lese sie aus, schreibe sie in einen charbuffer. Schick den Charbuffer zurück zum Client erstelle eine leere Datei und dort befülle ich die Datei mit.

    Wenn ich mir das so durchlese, hört es sich ziemlich kompliziert an. Würde das auch einfacher gehen? Und noch zwei kurze Fragen: Wie sucht ihr im Verzeichnis nach der Datei? und was ist mit blockweise genau gemeint? muss ich da irgendwas beachten?

    Lg



  • Klingt doch recht gut. 😉
    Sieh dir mal sendfile() und stat() an.



  • Ich würde die Datei einfach öffnen. Wenn die Datei vorhanden ist klappts, sonst gibt es einen Fehler (dann brauchst du auch nicht suchen).

    Blockweise meint das du einen Block von sagen wir mal 1024 Zeichen einliest und dann auf einmal sendest. Ist die Datei größer machst du es noch ein paar mal.

    Zeichenweise Übertragung übers Netzwerk macht zu viel Overhead und dauert dadurch länger 🙂



  • hallo :xmas1:

    danke für die antworten!
    ich schau mir morgen mal die sendfile und stat an 🙂

    kurzen blick drüber geworen und stat scheint doch sehr mächtig zu sein 🙂 das mit dem öffnen ist auch nicht schlecht, werde ich versuchen.

    danke!

    Lg



  • Hallo,

    bei mir steht soweit alles nur eines bekomm ich nicht hin und zwar ist eine Aufgabenstellung:

    Fügen Sie dem Client eine prozentuelle Fortschrittanzeige hinzu.

    Wie kann ich das genau realisieren?

    Lg



  • In dem du dir vom Server die Informationen holst wie groß die Datei ist und dann deine empfangene Datenmenge mit dem vergleichst was die Datei insgesamt groß ist.

    Das ganze rechnest du in Prozente um und zeigst die irgendwie an (Per GUI oder Konsole oder ka was du halt willst)



  • downtimes schrieb:

    In dem du dir vom Server die Informationen holst wie groß die Datei ist und dann deine empfangene Datenmenge mit dem vergleichst was die Datei insgesamt groß ist.

    Das ganze rechnest du in Prozente um und zeigst die irgendwie an (Per GUI oder Konsole oder ka was du halt willst)

    Ja, per Konsole 😉

    Ok danke erstmal. Also würde es so gut aussehen:

    ich öffne die Datei hol mir mit stat(name,&buf) die Fileinfo. Kann ich sie dann schon rüberschicken (denke das wird noch nicht die Größe sein. 😕

    Wenn buffer das ist, was gesendet werden soll:

    buffer = size.buf;

    könnte das so ca. hinkommen?
    Danach würde ich aber leicht anstehen. Also wenn eine Datei 1000 bytes groß ist, ich sie vergleiche. Wie sag ich ihr dann, dass sie bei jedem 10tel zB einen Punkt "." machen soll?

    Bin jetzt leider noch nicht daheim, ab halb 5 gehts dann wieder los 😉

    Lg



  • Na so ganz scheint das noch nicht verstanden worden zu sein.
    Also im prinzip holst du dir die infos über die Datei auf dem Server (das bekommst du ja hin mit stat).
    Da gibts nun ein Feld das so heißt

    off_t     st_size;    /* total size, in bytes */
    

    Diese information schickst du nun an deinen Clienten zurück.
    Danach fängst du an deine Datei selbst zu schicken (also die einzelnen bytes
    der Datei).

    Der client empfängt diese nun und vergleicht die bisher gesendeten bytes
    mit dem was als st_size geschickt wurde.
    Also rechnest du

    float prozente = empfangene_bytes/st_size; //zahl in [0,1]
    

    Diese zeigst du nun irgendwo in deiner Konsole an oder wenn prozente wieder 0.1
    dazubekommen hat machste halt deinen nächsten Punkt in der Konsole oder oder...
    Das ist an der stelle komplett dir überlassen.

    Hoffe das war halbwegs verständlich?

    MFG downtimes



  • Du sollst doch sowieso die Daten Blockweise übertragen.
    Dann kannst du nach jedem Block ausrechnen wie viel schon übertragen wurde.


Anmelden zum Antworten