Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Prism EConvert Error Fehler bei Socketverbindung (https://www.delphipraxis.net/67812-econvert-error-fehler-bei-socketverbindung.html)

DocZenith 20. Apr 2006 10:32


EConvert Error Fehler bei Socketverbindung
 
Hi!
Hab folgendes Problemchen:
Ich bekomme eine spontan auftretende Fehlermeldung. In der Meldung steht EConvert Error.
Dabei geht es um eine String Variable die über eine Socketverbinden alle 0,5 Sek. einen Wert
bekommt. Der Wert in der String Variable wird dann in in einen Integerwert umgewandelt und
in eine Integervariable gespeichert. In diesem Beispiel liegt wohl in der Integer oder String
variable 2 Werte drin (-5 und -20).

Delphi-Quellcode:
procedure TMainForm.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
wert: integer;

begin

  { MSG Wert auf Null gesetzt }
  MSG := '';
  wert := 0;
  { Daten werden vom Socket empfangen und gespeichert }
  MSG := Socket.ReceiveText;
  { Socketwert wird in Interger umgewandelt und in Wert gespeichert }
  wert:= strtoint(msg);
  { MSG Wert wieder auf Null gesetzt, damit keine doppelten Einträge geschrieben werden }
  MSG := '';
  { Ausgabe des aktuellen Differenzwertes }
  edit2.Text:= inttostr(wert);
  { Übergabe des Differenzwertes an die Regler Prozedur für die entsprechene Regellung }
  regler(wert);
end;
http://timely.de/image001.jpg

Muetze1 20. Apr 2006 10:52

Re: EConvert Error Fehler bei Socketverbindung
 
Einfache Antwort: Du brauchst ein Protokoll!

Wenn du mit SendText oder sonstwie Daten abschickst, dann können die noch kleineren Einzelteilen oder viel grösseren Stücken wieder ankommen. Der Socket überträgt nur die Daten, ihn kümmert es nicht, wo du einen Block teilst. Das bedeutet, wenn du 2x SendText('a'); aufrufst, dann wirst du auf der Gegenseite nicht 2x ReceiveText aufrufen müssen - ganz im Gegenteil. Es ist sogar recht wahrscheinlich, dass du mit einmaligen ReceiveText beide Inhalte auf einmal empfängst.

Und um nun zu unterscheiden wo ein Block aufhört und der nächste anfängt, müsstest du dir ein Protokoll ausdenken, was dir diese Teilung ermöglicht und auch die Möglichkeit bietet zu erkennen, ob du einen Block schon komplett empfangen hast, um ihn zu verarbeiten. Ein einfaches Protokoll wäre in diesem Falle schon einfach nur ein Zeichen, was du so nicht nutzt - z.B. das Leerzeichen in deinem Falle (wenn es nur Zahlen sind). Dann weisst du immer, dass zwischen 2 Leerzeichen ein Wert steht. Bzw. bis zum nächsten Leerzeichen, etc.

Aber da kannst du deine Fantasie am Protokoll auslassen...

heute haargenau 2 Jahre in der dp.net unterwegs...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:41 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