Thema: Delphi ServerSocket1ClientRead

Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#6

Re: ServerSocket1ClientRead

  Alt 24. Sep 2006, 19:45
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...
  Mit Zitat antworten Zitat