Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Datenaustausch TIdUDPClient/TIdUDPServer (https://www.delphipraxis.net/194433-datenaustausch-tidudpclient-tidudpserver.html)

Hobbycoder 20. Nov 2017 13:14

Datenaustausch TIdUDPClient/TIdUDPServer
 
Hi,

ich tausche Daten zwischen 2 Anwendungen per UDP aus.
Gesendet wird per IdUDPClient:
Delphi-Quellcode:
procedure TSendDataThread.SendMessage(msg: TMsg);
var
  b: TIdBytes;
begin
  SetLength(b, length(msg.Msg));
  b:=TIdBytes(msg.Msg);
  FUDPClnt.SendBuffer(msg.IP, FPort, b);
end;
im Server soll das mit
Delphi-Quellcode:
RecStr:=BytesToString(AData);
wieder umgesetzt werden.

Was bisher mittel FUDPClnt.Broadcast(...) super funktionierte, klappt mit SendBuffer nicht.

Wenn ich "test" sende, dann kommt beim Server "T#0e#0s#0t#0" an.

Ich möchte aber im Server für Broadcast-Messages und direkte Messages die gleiche Routine verwenden.
Wie kann ich SendBuffer verwenden, damit das gleiche ankommt wie bei Broadcast?

Redeemer 20. Nov 2017 17:45

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Du sendest einen WideString (UTF-16LE, wie man sieht), sagst aber dem Empfänger, er erwarte einen AnsiString. Das klappt natürlich nicht, denn da solltest du dich auf ein und dasselbe einigen.

WideString ist besser, da auf jedem Windows seit 2000 immer als UTF-16LE definiert (davor war es UCS-2LE), AnsiString ist abhängig von der Region und fliegt dir auf Rechnern mit MBCS komplett um die Ohren.

Delphi-Quellcode:
function BytesToWideString(const AData: TBytes): WideString;
var
  i: Integer;
begin
  Result := '';
  for i := 0 to Length(AData) div 2 - 1 do
  Result := Result + WideChar(Word(AData[i shl 1 + 1]) shl 8 + AData[i shl 1]);
end;
Sollte eine Umstellung des Empfängers nicht möglich sein, stelle den Sender auf AnsiString um. Das geht so:
Delphi-Quellcode:
b:=TIdBytes(AnsiString(msg.Msg));
Implizite Typumwandlungen von Strings sind in Delphi nicht implizit!
Wie gesagt, auf Rechnern mit MBCS fliegt dir das Programm um die Ohren, aber egal.

Hobbycoder 21. Nov 2017 18:16

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Zitat:

Zitat von Redeemer (Beitrag 1386743)
Wie gesagt, auf Rechnern mit MBCS fliegt dir das Programm um die Ohren, aber egal.

Das die Anwendung nur auf einer überschaubaren, begrenzten Anzahl an Rechner laufen wird (die auch noch alle bei mir stehen :-D ) kann ich mit dem Risiko leben.

Aber danke für die Antwort und danke für den Hinweis.

Dem zur Folge wäre es ja eigentlich ratsam generell nur noch mit Widestring zu arbeiten? Da könnte man ja unter Delphi im Grund auf alle anderen Stringtypen verzichten, bzw. sie alle intern als Widestring behandeln. Warum macht Emba das nicht? Um Speicher einzusparen?

Redeemer 21. Nov 2017 20:04

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Emba macht das. Seit Delphi 2009 ist alles WideString, solange man nicht ausdrücklich etwas anderes erzwingt. Auch
Delphi-Quellcode:
string
ist ab hier WideString, davor war es AnsiString.

Indys BytesToString macht das offenbar nicht. Obwohl es einen WideString zurückgibt, unterstützt es WideStrings offenbar nicht. Hat sich vermutlich aus Abwärtskompatibilitätsgründen so erhalten. Unicode-Unterstützung in Indy ist grausam.

Hobbycoder 23. Nov 2017 07:23

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Danke für eure Unterstützung.:thumb::thumb: Jetzt ist mir das klar.

Bernhard Geyer 23. Nov 2017 08:23

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Zitat:

Zitat von Redeemer (Beitrag 1386834)
Seit Delphi 2009 ist alles WideString

[Klugscheißermodus=On]
Nicht ganz. Ab D2009 ist es ein Unicodestring und nicht mehr der (von Windows speichertechnisch verwaltete) Widestring.
Ruft man Windows-API-Methoden auf, so stört das nicht, das die Speicherverwaltung an den Widestring angelehnt ist und der Unicodestring immer noch (wie auch früher der Ansistring) ein Abschließendes #0-Zeichen hat um WinAPI-Komaptible zu sein.
Vorteil: Speicherverwaltung mit Unicodestring ist viel schneller als mit Widestring
[Klugscheißermodus=off]

p80286 23. Nov 2017 08:59

AW: Datenaustausch TIdUDPClient/TIdUDPServer
 
Hallo Klugscheißer, was sind denn die genauen Unterschiede?

Gruß
K-H


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