tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
1014
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Hi,

    Gibt es eine möglichkeit über ein Socket Dateien zu senden.
    Ich habe zwar schon probiert die Datei einzulesen und dann in ein Buffer zu schreiben und diesen dann zu send aber das klappt nicht. Gibt es eine andere Möglichkeit ?

    Ich wäre dankbar für links oder andere hilfreiche infos

    MFG ProgX
     

  2. #2
    oglimmer oglimmer ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Ort
    Frankfurt
    Beiträge
    49
    Warum klappt das nicht?

    Das binäre lesen einer Datei, dann über das Socket versenden und am Ende wieder binär speichern, muss gehen.

    Ich sehe keinen Grund, dass das nicht funktionieren sollte.
     

  3. #3
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Hi,

    Binär einlesen hab ich noch gar nicht versuch !
    Danke für den Tip
     

  4. #4
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    hi,

    Ich hab jetzt ein kleines Problem
    Hier der Code (jedes mal wenn ich über den Client eine Datei downloaden will dann erscheint "test.exe hat ein Problem festgestellt und muss beendet werden. [Debugen] [senden] [nicht senden]"):
    Server teil :
    Code :
    1
    2
    3
    4
    5
    
    char ctext;
    ifstream datei("bla.exe", ios::binary);
    while(datei.get(ctext))
    send(socket, (const char *) ctext, strlen((const char *) ctext), 0);
    ...



    Client teil :

    Code :
    1
    2
    3
    4
    5
    
    char buf;
    ofstream datei("bla2.exe", ios::binary);
    recv(s, buf, 1024, 0);
    datei << buf;
    ...

    MFG ProgX
     

  5. #5
    oglimmer oglimmer ist offline Mitglied Bronze
    Registriert seit
    Feb 2004
    Ort
    Frankfurt
    Beiträge
    49
    Ich habe gerade wenig Zeit, ob das also letztlich funkt weiß ich nicht.

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    char ctext; // das ist ein Zeichen!
    ifstream datei("bla.exe", ios::binary);
    while(datei.get(ctext)) // das liest ein zeichen
     
    send(socket, (const char *) ctext, 1, 0); // also darf man auch nur ein zeichen senden. strlen(char) ist falsch! 
     
    ...


    Code :
    1
    2
    3
    4
    5
    
    char buf; // das gleiche, nur ein zeichen
    ofstream datei("bla2.exe", ios::binary);
    recv(s, buf, 1, 0); // also auch nur ein zeichen lesen!
    datei << buf;
    ...
     

  6. #6
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    das funkt auch net !
    ich hab das gefühl das es was mit dem
    send(socket, (const char *) ctext, strlen((const char *) ctext), 0);
    zu tun hat was haltet ihr davon ?

    Gruß ProgX
     

  7. #7
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    cText ist nur ein Zeichen, ein Byte.

    Der allererste Ansatz, Datei in Puffer, und den Puffer dann senden war schon richtig. Zeig mal deinen Code dafür.

    Hinweis: send schafft vielleicht nicht immer alles am Stück, es gibt aber zurück, wieviel Bytes jetzt schon gesendet worden sind.

    Genauso ist es beim Empfang, das kommt nicht alles unbedingt in einem Schwung an. Deshalb empfiehlt es sich, die Länge der Datei vor der Datei selbst zu senden. Am anderen Ende wird dann solange ge-recv-ed, bis die Datei komplett da, oder die Verbindung weg ist. Hier muss man evtl. mehrere empfangene Teile zusammensetzen.
     

  8. #8
    ProgX ProgX ist offline Mitglied
    Registriert seit
    May 2004
    Beiträge
    14
    Hi,

    Danke für die Antworten
    Sorry das ich nicht gleich antworten konnte.
    @Endurion
    Ich weiß zwar was du meinst aber ich hab kein plan wie man das in einem Prog umsetzen kann kannst du vieleicht ein kleines Beispiel posten.

    MFG ProgX
     

  9. #9
    Registriert seit
    Jan 2002
    Ort
    Bayern
    Beiträge
    1.390
    mehrere empfangene Teile zusammensetzen.
    Mehrere Teile, das ist zum einen mal der Springende Punkt.
    Du sollst die Datei auf alle Fälle Blockweise einlesen, sonst wäre das Speichertechnisch nicht tragbar.
    Bei kleinen Dateien ist das kein Problem, aber was machst du wenn du eine Datei mit 500 MB oder mehr versenden willst? Liest du die auch komplett in den Speicher ein? Das würde zu massiven Performanceverlusten führen. (ich denke da an ein System mit 256 MB RAM ).
    Deshalb ließ die Datei immer in z.B. 16k Blöcken oder so ähnlich.
    Außerdem würde ich mir ein Eignenes Protokoll definieren und bei jedem senden dann ein Objekt senden (Sagen wir mal das das Objekt 16k groß ist).
    Diese Objekt hast du in Form einer Klasse vorliegen und ließt dort dann immer einen Teil ein und gibst die Größe mit an.
    Dann schickst du das Objekt rüber und "packst" das Ganze wieder aus.

    Gruß Homer
     
    we would change the world if god gave us the source code...
    and remember, science is nothing more than reverse engineering nature...

    Current projects:
    - LdrawConverter

  10. #10
    Registriert seit
    May 2004
    Beiträge
    287
    Ich würde ganz und gar noch weiter gehen und noch andere Datensicherheitssyteme verwenden. Verschlüsseln vielleicht nicht unbedingt, aber Checksummen auf jeden Fall, damit man sich wenigstens sicher sein kann, korrekte Daten zu transferieren.
     

  11. #11
    Avatar von Martin Schroeder
    Martin Schroeder Martin Schroeder ist offline Mitglied Gold
    Registriert seit
    May 2004
    Ort
    Glückstadt (SH)
    Beiträge
    120
    Man muss die Daten mit fread() einlesen, weil ifstream den "Öffnungsmodus" an die Variablensorte anpasst, also bei char auch als Textdatei öffnet.
    Das ganze müsste beim öffnen so aussehen:

    char byte;
    FILE *Datei=fopen("blabla.txt", "r");
    while(!feof(Datei))
    {
    fread(&byte, sizeof(byte), 1, Datei);
    ...
    }

    Probier das mal
     
    while(!asleep())
    {
    sheep++;
    }
    *gähn* ;-)

  12. #12
    Avatar von Martin Schroeder
    Martin Schroeder Martin Schroeder ist offline Mitglied Gold
    Registriert seit
    May 2004
    Ort
    Glückstadt (SH)
    Beiträge
    120
    P.S.
    Entsprechen muss dann auch mit dem schrieben ein die Datei vorgegangen werden

    FILE *Datei=fopen("blablaaus.txt", "w");
    ...
    fwrite(&byte, sizeof(byte), 1, Datei);
    ...

    Und am Ende natürlich beim öffnen und schließen
    fclose(datei);
     
    while(!asleep())
    {
    sheep++;
    }
    *gähn* ;-)

Ähnliche Themen

  1. Dateitransfer über Socket
    Von simon1389 im Forum Java
    Antworten: 6
    Letzter Beitrag: 27.12.10, 23:27
  2. Mail per Socket sende. Body fehlt
    Von GalaxyWarrior im Forum .NET Web und Kommunikation
    Antworten: 3
    Letzter Beitrag: 09.01.10, 21:14
  3. Antworten: 7
    Letzter Beitrag: 18.08.08, 11:15
  4. Mehrere Dateien über Socket senden
    Von ELiTeOne im Forum Java
    Antworten: 11
    Letzter Beitrag: 04.02.08, 22:03
  5. udp socket, wie sende ich etwas zum Server
    Von Fridulin im Forum .NET Archiv
    Antworten: 6
    Letzter Beitrag: 10.03.05, 11:04