Moin!
Die Brotmafia hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5:
| text:=Socket.ReceiveText;
if copy(text,0,7)='GetFile' then begin try StreamPath:=copy(text,8,length(text)); | |
Wer sagt denn, dass copy(text,8,length(text)) tatsächlich nur den Dateinamen liefert und nicht noch etwas vom nächsten Text, den der Server sendet? In diesem
FAQ-Beitrag ist genau erklärt, warum das nicht zuverlässig funktioniert.
Die Brotmafia hat folgendes geschrieben: |
Delphi-Quelltext 1: 2:
| Socket.SendText('Size' + inttostr (FStream.Size)); sleep(100); | |
Wieder das gleiche: verlass dich nicht auf das Ereignissystem, das ist nicht sicher. Siehe oben! Dann noch die interessante Konstruktion mit dem try-finally-SendStream...

also du versuchst den Dateinamen zu empfangen, aber sendest in jedem Fall den Stream, auch wenn du ihn gar nicht aufgemacht hast...

ob das mal so im Sinne des Erfinders ist...
Die Brotmafia hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3:
| if text='FileThere' then begin FStream.Free; end; | |
Wenn dir der Server mittem im Stream-Senden (z.B. weil die Datei ziemlich gross ist) den Text "FileThere" sendest, machst du den Stream zu - und kriegst ne fette Exception... weil der Socket noch versucht zu lesen/senden...
Die Brotmafia hat folgendes geschrieben: |
ServerSocket empfängt:
Delphi-Quelltext 1: 2: 3: 4: 5:
| text:=Socket.ReceiveText;
if copy(text,0,4)='Size' then begin try FileGroesse:=strtoint(copy(text,5,length(text))); | |
Wie oben, was ist, wenn da mehr im Buffer liegt... und auch wieder die interessante try-finally-Konstruktion: wenn das Anlegen des Streams nicht klappt, wird auf jeden Fall reingeschrieben...

in einen Stream, der gar nicht existiert...
Die Brotmafia hat folgendes geschrieben: |
| Also funktionieren tut das ganze ja wunderbar, nur weis ich anscheinend nicht so recht was ich da tue. |
Tja, was soll ich dazu sagen; ich halte das für mehr als zweifelhaft, ob das so sauber funktioniert. Sagen wir mal lieber so, es hat bei dir bisher noch nicht nicht funktioniert, mehr wirst du nicht behaupten können, da der Code ganz klar unsicher ist.
Die Brotmafia hat folgendes geschrieben: |
| pBuffer:=@Buffer; wozu braucht man den Buffer? |
Das ist nicht der Buffer, sondern ein Zeiger darauf, der Buffer ist das array. Du mußt die Daten, die aus dem Socket kommen, doch irgendwo hintun, dann kannst du das erst in den Stream schreiben.
Die Brotmafia hat folgendes geschrieben: |
SizeofBuffer:=Socket.ReceiveBuf(pBuffer^, 4096); Warum pBuffer und warum die Zahl 4096?
Warum nicht z.B. 5055? |
S.o., ist der Zeiger auf den Buffer; 4096 (=4kb) ist willkürlich, du kannst natürlich auch 5055 Bytes nehmen, aber weil Buffergrößen in Zweierpotenzen effektiver verarbeitet werden (weil kein Überhang), nimmt man natürlich "glatte" Zahlen.
Die Brotmafia hat folgendes geschrieben: |
| FileStream.Write(pBuffer^, SizeofBuffer); Wie funktioniert das? Warum bruacht man da den Buffer und was sagt das SizeofBuffer? |
Du hast die Daten in den Buffer gelesen, jetzt willst du sie in den Stream schreiben, irgendwoher muss der Stream doch wissen, wo die Daten sind -> im Buffer.

Hausaufgabe: übersetze "size of buffer" ins deutsche...
Die Brotmafia hat folgendes geschrieben: |
| Da versteh ich alles einigermaßen, ist der code da ok oder muss man da was optimieren? |
Der war gut, du mußt die Fehler entfernen, nicht optimieren...

Schau dir mal genau das Tutorial an, damit du einen Plan von einem Protokoll bekommst; danach kannst du dich um binäre Protokolle bemühen, aber so wird das nix.

Sorry, ist nicht wertend, nur ehrlich.
cu
Narses