Dateien sende über Socket

ProgX

Grünschnabel
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 :-)
 
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.
 
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:
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:
char buf;
ofstream datei("bla2.exe", ios::binary);
recv(s, buf, 1024, 0);
datei << buf;
...

MFG ProgX
 
Ich habe gerade wenig Zeit, ob das also letztlich funkt weiß ich nicht.

Code:
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:
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;
...
 
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 :)
 
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.
 
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 :-)
 
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
 
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.
 
Zurück