ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
1014
1014
EMPFEHLEN
-
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,
Binär einlesen hab ich noch gar nicht versuch !
Danke für den Tip
-
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
-
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; ...
-
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
-
21.05.04 13:57 #9
- Registriert seit
- Jan 2002
- Ort
- Bayern
- Beiträge
- 1.390
Mehrere Teile, das ist zum einen mal der Springende Punkt.mehrere empfangene Teile zusammensetzen.
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ß Homerwe would change the world if god gave us the source code...
and remember, science is nothing more than reverse engineering nature...
Current projects:
- LdrawConverter
-
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.
-
26.05.04 18:00 #11
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 malwhile(!asleep())
{
sheep++;
}
*gähn* ;-)
-
26.05.04 18:04 #12
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
-
Dateitransfer über Socket
Von simon1389 im Forum JavaAntworten: 6Letzter Beitrag: 27.12.10, 23:27 -
Mail per Socket sende. Body fehlt
Von GalaxyWarrior im Forum .NET Web und KommunikationAntworten: 3Letzter Beitrag: 09.01.10, 21:14 -
Mehrere Dateien über einen Socket senden
Von ReaX im Forum JavaAntworten: 7Letzter Beitrag: 18.08.08, 11:15 -
Mehrere Dateien über Socket senden
Von ELiTeOne im Forum JavaAntworten: 11Letzter Beitrag: 04.02.08, 22:03 -
udp socket, wie sende ich etwas zum Server
Von Fridulin im Forum .NET ArchivAntworten: 6Letzter Beitrag: 10.03.05, 11:04





Zitieren
Login






