Zitat von
yildi:
nur wie erkenn ich denn, wann die größenangabe nach DATA: zu ende ist ?
Diese Frage bleibt offen und genauso ist die Sache mit abprüfen ob vorne "DATA" steht, genauso schwachsinnig. Damit würdest du jede Binärdatei vor der Übertragung ausschliessen, welche mit "DATA" anfängt oder dieses Wort enthält. Schick mal den Text dieses Threads über den Socket und du wirst ein Problem bekommen.
@yildi:
Schick vor dem Stream einfach dessen Grösse mit:
Delphi-Quellcode:
Var
lSize: Int64;
Begin
lSize := Stream.Size; // Grösse der zu sendenen Datei
Socket.SendBuf(lSize, SizeOf(lSize)); // Grösse vorneweg schicken
Socket.SendStream(Stream);
End;
Beim Empfänger:
Delphi-Quellcode:
fSize : Int64; // als Klassenmitglied deklarieren
fReceiveStream: TStream; // dito
...
Procedure SocketEmpfangen(...)
Var
lBuff: Pointer;
lSize: Int64;
Begin
If Not Assigned(fReceiveStream) And ( Socket.ReceiveLength >= SizeOf(Int64) ) Then
Begin
Socket.ReceiveBuf(fSize, SizeOf(fSize));
fReceiveStream := {TMemoryStream}TFileStream.Create(...);
End
Else If Assigned(fReceiveStream) Then
Begin
lSize := Min(fSize - fReceiveStream.Size, Socket.ReceiveLength);
lBuff := GetMem(lSize);
Try
Socket.ReceiveBuf(lBuff^, lSize);
fReceiveStream.WriteBuffer(lBuff^, lSize);
Finally
FreeMem(lBuff);
End;
If ( fReceiveStream.Size = fSize ) Then
Begin
FreeAndNil(fReceiveStream);
fSize := 0;
End;
End;
End;
ein kleiner Pseudocode um dies zu verdeutlichen...