AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenaustausch TIdUDPClient/TIdUDPServer

Ein Thema von Hobbycoder · begonnen am 20. Nov 2017 · letzter Beitrag vom 23. Nov 2017
Antwort Antwort
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 20. Nov 2017, 14:14
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 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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (20. Nov 2017 um 16:17 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 20. Nov 2017, 18:45
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:
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.
Janni
2005 PE, 2009 PA, XE2 PA

Geändert von Redeemer (20. Nov 2017 um 18:47 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 21. Nov 2017, 19:16
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 ) 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?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 21. Nov 2017, 21:04
Emba macht das. Seit Delphi 2009 ist alles WideString, solange man nicht ausdrücklich etwas anderes erzwingt. Auch 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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#5

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 23. Nov 2017, 08:23
Danke für eure Unterstützung. Jetzt ist mir das klar.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 23. Nov 2017, 09:23
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]
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Datenaustausch TIdUDPClient/TIdUDPServer

  Alt 23. Nov 2017, 09:59
Hallo Klugscheißer, was sind denn die genauen Unterschiede?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  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 12:11 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