Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi SocketServer / -Client: Übertragung eines Strings im Record (https://www.delphipraxis.net/117592-socketserver-client-uebertragung-eines-strings-im-record.html)

p0w3r5tr34m3r 21. Jul 2008 17:12


SocketServer / -Client: Übertragung eines Strings im Record
 
Hallo DP,
momentan arbeite ich an einem Projekt welches über Sockets Daten an einen Server schickt. Unteranderem auch Strings variabler Länge... Wobei wir schon bei meiner Frage sind: Gibt es einen schöneren Weg, Strings in Records zu versenden, als diesen?

Delphi-Quellcode:
TMyRecord = record
  angreifer, verteidiger: string[50];
  waffe_a, waffe_b: string[40];
  bericht: array of char;
end;

var
  Form1: TForm1;
  kb: TMyRecord;

procedure TForm1.Send;
var
  t: string;
begin
  // [...]
  t := memo1.Text;
  setlength(kb.bericht, length(memo1.text));
  strpcopy(kb.bericht, t); // <--- Das is der einzigste weg, wie ich es übertragen bekomme
  // [...]
end;

Mit freundlichen Grüßen,
p0w3r5tr34m3r

xxl1 21. Jul 2008 17:23

Re: SocketServer / -Client: Übertragung eines Strings im Rec
 
hmm da gibts immer ein problem mit variablen längen und dem Buffer von Winsock, hab mich auch mal ne Zeit lang mit beschäftigt aber so sieht das ganz gut aus :-)
Aber vllt gibts ja noch ne bessere Methode die ich auch noch nicht kenne...wäre ich auch dran interessiert (Is jetz in indirekter Push, hoffe das stört keinen :-) )

Muetze1 21. Jul 2008 18:07

Re: SocketServer / -Client: Übertragung eines Strings im Rec
 
Moin!

"Array of Char" ist ein dynamisches Array und somit wird in der Struktur nicht die Daten an sich sondern nur die Adresse der Daten gespeichert. Somit überträgst du nur die Adresse der Daten, welche nur in deinem sendenen Prozess gültig ist und dem Empfänger rein gar nichts nützen.

Wenn du variable Strings versenden willst, dann musst du dich grundlegend schonmal von den festen Strukturen einer Record Definition trennen. Du musst den String in zwei Bestandteilen versenden: als erstes die Länge und dann die Daten des Strings selbst.

Pseudo-Code senden:
Delphi-Quellcode:
procedure SendString(ASocket: TCustomWinSocket; const AData: string);
var
  lLen: integer;
begin
  lLen := length(AData);
  ASocket.SendBuf(lLen, sizeof(lLen)); // 4 Bytes mit der Länge der folgenden Stringdaten
  ASocket.SendBuf(AData[1], lLen);
end;
Pseudo-Code empfangen:
Delphi-Quellcode:
function ReceiveString(ASocket: TCustomWinSocket; const AData: string): string;
var
  lLen: integer;
begin
  result := '';

  if ASocket.ReceiveLength >= sizeof(lLen) then
  begin
    ASocket.ReceiveBuf(lLen, sizeof(lLen)); // 4 Bytes mit der Länge der folgenden Stringdaten

    if ( lLen > 0 ) and ( ASocket.ReceiveLength >= lLen ) then
    begin    
      SetLength(result, lLen);
      ASocket.ReceiveBuf(result[1], lLen);
    end;
  end;
end;
MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz