AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi SocketServer / -Client: Übertragung eines Strings im Record
Thema durchsuchen
Ansicht
Themen-Optionen

SocketServer / -Client: Übertragung eines Strings im Record

Ein Thema von p0w3r5tr34m3r · begonnen am 21. Jul 2008 · letzter Beitrag vom 21. Jul 2008
Antwort Antwort
Benutzerbild von p0w3r5tr34m3r
p0w3r5tr34m3r

Registriert seit: 18. Aug 2003
Ort: Monheim am Rhein
153 Beiträge
 
RAD-Studio 2009 Pro
 
#1

SocketServer / -Client: Übertragung eines Strings im Record

  Alt 21. Jul 2008, 18:12
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
Florian Cülter
ich bin ein notorischer alles-klein-schreiber!

der 100. Beitrag nach 3 Jahren 25 Wochen und einem Tag
  Mit Zitat antworten Zitat
xxl1

Registriert seit: 21. Apr 2006
88 Beiträge
 
FreePascal / Lazarus
 
#2

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

  Alt 21. Jul 2008, 18:23
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 )
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

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

  Alt 21. Jul 2008, 19:07
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 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