Einzelnen Beitrag anzeigen

Gimp

Registriert seit: 27. Dez 2007
7 Beiträge
 
Delphi 2006 Personal
 
#1

TServerThread.ClientExecute; Buffer Problem

  Alt 4. Okt 2011, 22:15
Hallo zusammen!

Ich beschäftige mich momentan mit den Komponenten TServerSocket und TClientSocket. Damit alle Daten alle zuverlässig ankommen, erstellt der Server für jeden Client Socket einen neuen Thread. Im Internet habe ich dazu eine nette Lösung gefunden:
Delphi-Quellcode:
procedure TServerThread.ClientExecute;
var
  ac, readlen : integer;
  fRequest: Array[0..1023] of Byte;
begin
  inherited FreeOnTerminate := TRUE;
  try
    fSocketStream := TWinSocketStream.Create(ClientSocket, 100000);
    // 100000 is the timeout in miliseconds.
    try
      while ( not Terminated ) and ( ClientSocket.Connected ) do
      try
        if fSocketStream.WaitForData(10000) then
        begin
          FillChar(fRequest, 1024, 0);
          ac := 0;
          repeat
            readlen := fSocketStream.Read(fRequest[ac], 1024);
            inc(ac, readlen);
            ShowMessage(IntToStr(readlen));
          until (readlen = 0) or (ac = 1024);
        end;
      except
        on e:exception do
        begin
          // An error has occurred, close and exit
          ClientSocket.Close;
          Terminate;
        end;
      end;
    finally
      fSocketStream.Free;
    end;
  except
    on e:exception do
    begin
      // An error has occurred, close and exit
      ClientSocket.Close;
      Terminate;
    end;
  end;
end;
Der Code an sich funktioniert soweit ganz gut. Wenn ich das erste Datenpaket von 2 Bytes sende, erhalte ich mittels meiner ShowMessage auch eine Datengröße von 2. Sende ich während die Meldung geöffnet ist weitere Daten, z.B. 10x 2 Byte große Datenpakete, wird in der nächsten Meldung 20 angezeigt. Die Pakete werden also alle in einen Buffer gequetscht, statt die Funktion 10x aufzurufen. Gibt es da einen komfortablen Weg um die Pakete wieder zu splitten? Die Größe der Daten ist nicht immer gleich, die Daten in 2 Byte große Häppchen zu zerschneiden ist also keine Lösung.

Liebe Grüße

Geändert von Gimp ( 4. Okt 2011 um 23:48 Uhr)
  Mit Zitat antworten Zitat