![]() |
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 |
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 :-) ) |
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:
Pseudo-Code empfangen:
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;
Delphi-Quellcode:
MfG
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; Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz