AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy10 Kommunikation über UDP mit 8 Bit Codierung

Indy10 Kommunikation über UDP mit 8 Bit Codierung

Ein Thema von AJ_Oldendorf · begonnen am 12. Jun 2009 · letzter Beitrag vom 16. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2   
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#1

Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 12. Jun 2009, 08:13
Hallo erstmal

UDP Kommunikation mit Indy Komponenten

BDS 2006 und Indy 10 = OK
RAD 2009 und Indy 10 = NICHT OK

Ich benutze den TIdUDPClient um Daten über UDP zu senden.

1. TIdUDPClient

Funktionsaufruf:

procedure Send(const AData: string); overload;

2. TIdUDPClient abgeleitet von TIdUDPBase

Funktionsaufruf:

procedure Send(const AHost: string; const APort: TIdPort; const AData: string);

Diese Funktion ruft widerrum folgende auf:

SendBuffer(AHost, APort, ToBytes(AData));



Hier liegt der Knausus Knaktus...

ToBytes(AData) wird aufgerufen mit einem Standardparameter als const

function ToBytes(const AValue: string; const AEncoding: TIdEncoding = en7Bit): TIdBytes; overload;
{$IFDEF USEINLINE}inline;{$ENDIF}
begin
Result := ToBytes(AValue, -1, 1, AEncoding);
end;


Warum wird hier überall mit der 7 Bit Codierung gearbeitet?
Man hat von außen keine Chance dies zu ändern...
Ich brauche aber unbedingt das 8 Bit Format. Es gibt ja auch den Parameter en8Bit aber ich kann
ja in den Indy's nichts ändern.
Wie bekomme ich es hin, dass meine ganze Kommunikation (über UDP) mit en8Bit arbeitet?
Es gibt in den Indy's keine Möglichkeit einen globalen Schalter zu setzen, dass mit 8 Bit
Verschlüssung alles gemacht werden soll.
Die Kommunikation über UDP mit BDS 2006 und den darin mitgelieferten Indy10 funktioniert.
Nur in RAD2009 funktioniert es nicht.

Habt ihr eine Lösung oder Idee hierfür?
Meine Software auf 7 Bit Codierung umzustellen kommt dabei wirklich nicht in Frage...

Viele Grüße im voraus,
Alex
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#2

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 12. Jun 2009, 10:11
Hi,

Zitat von AJ_Oldendorf:
1. TIdUDPClient

Funktionsaufruf:

procedure Send(const AData: string); overload;
Indy Version updaten, wir haben die Encoding Wrapper bereits erweitert (ca. März 2009). Der Aufruf lautet nun:
Delphi-Quellcode:
TIdUDPClient.Send(const AData: string; AEncoding: TIdTextEncoding = nil); overload;

und

TIdUDPBase.Send(const AHost: string; const APort: TIdPort; const AData: string;
  AEncoding: TIdTextEncoding = nil);
Alternativ: Eigene Klasse ableiten und Send() mit reintroduce/overload selbst korrigieren. Gleiches für UDPBase.

Zitat von AJ_Oldendorf:
Warum wird hier überall mit der 7 Bit Codierung gearbeitet?
Weil die meisten Internet Standards für die Protokolle (RFCs) dies fordern. Es gibt einige Erweiterungen, z.B. MIME Extensions, 8BITMIME bei SMTP etc.pp. - aber die Protokolle sind eben häufig 7bit textbasiert. Erst Erweiterungen und Neufassungen erlauben manchen Protokollen andere Encodings. Wo möglich und geboten, entscheiden die Komponenten selbst über das sinnvollste und konforme Encoding.

In Deinem Fall fehlte aber tatsächlich die Durchreichung des Encodings. Mit der aktuellen Version ist dies auch wieder implementiert.

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 12. Jun 2009, 13:28
Ich habe mir die aktuellen Indy's von fulgan (glaube ich) gezogen, Stand vorgestern Abend, da war der Source in diesem Bereich noch der gleiche...
Wo bekomme ich denn die Version die du meinst?
Danke aber für deine Hilfe.
Viele Grüße
Alex
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 12. Jun 2009, 22:34
Zitat von Assertor:
Alternativ: Eigene Klasse ableiten und Send() mit reintroduce/overload selbst korrigieren.
reintroduce/override = korrigieren
overload = erweitern
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#5

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 12. Jun 2009, 23:10
Zitat von omata:
Zitat von Assertor:
Alternativ: Eigene Klasse ableiten und Send() mit reintroduce/overload selbst korrigieren.
reintroduce/override = korrigieren
overload = erweitern
Und das um 23:34 als einziges zu diesem Thread...

Ich fass mal das wesentlich für Dich zusammen:
Zitat von Assertor:
Alternativ: Eigene Klasse ableiten und [...] selbst korrigieren.
Im Sinne von "den Fehler selbst korrigieren". Das läßt sich leider im Sinne der deutschen Sprache nicht überladen oder erweitern, sondern nur korrigieren...

Eine Erklärung bedürfen doch reintroduce/override/overload eigentlich nicht, sind sie ja sprachlich so eindeutig wie begin und end. Weiteres geht in Kopie an den Zwiebelfisch

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 13. Jun 2009, 21:56
@Assertor: Wo bekomme ich denn die von dir erwähnte Version der Indy's her?

Viele Grüße
Alex
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#7

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 14. Jun 2009, 11:35
Hi Alex,

Zitat von AJ_Oldendorf:
@Assertor: Wo bekomme ich denn die von dir erwähnte Version der Indy's her?
Vom Fulgan Mirror:
ftp://ftp.fulgan.com/ZIP/IndyTiburon.zip

Zitat von AJ_Oldendorf:
Ich habe mir die aktuellen Indy's von fulgan (glaube ich) gezogen, Stand vorgestern Abend, da war der Source in diesem Bereich noch der gleiche...
Wo bekomme ich denn die Version die du meinst?
Danke aber für deine Hilfe.
Hattest Du denn die aktuelle IndyTiburon.zip geladen?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 15. Jun 2009, 15:25
Hallo Assertor,
ich hatte anscheind irgendwie eine andere Version erwischt...
Jetzt sieht man, dass man bei der Funktion .Send ein Encoding Format angeben kann.
Leider funktioniert die 8bit Übertragung nicht.

Ich hänge dir mal zwei Beispielprojekte an.

Die Testanwendungen zum Senden und Empfangen mit UDP.
Die Datei UDPSendSequenz-BDS2006.zip enthält Quelltext und Anwendung zum Senden einer fortlaufenden wort-breiten Sequenznummer an die angegebene Ip-Adresse.
Compliert mit BDS 2006. Das klappt auch!

Die Datei UDPSendReceive-BDS2009.zip enthält Quelltext und die Anwendung für Senden und Empfangen unter Verwendung der neuen Indys (die du mir genannt hast).
Das Ding kann Senden (fehlerhaft) und Empfangen (da kommen die richtigen Werte, die man mit der BDS 2006 Anwendung abgschickt hat).

Zwischen 128 und 159 werden die Sequenzen verfälscht..
Schuld daran ist das Verwenden von Codepages. Wir müssen hier aber 8bit binär (1:1 !) übertragen.

IdGlobal; Zeile 2280 ff.
// RLebeau: TODO - implement a custom 8-bit encoding class?
//
// We need a class that converts UFT-16 codeunits in the $00-$FF range
// to/from their numeric values as-is. Was previously using "Windows-1252"
// (codepage 1252) for that, which does so for most codeunits, however
// codeunits $80-$9F in Windows-1252 map to different codepoints in Unicode,
// which we don't want. "ISO 8859-1" (codepage 28591), on the other hand,
// treats codeunits $00-$FF as-is, and seems to be just as widely supported
// as codepage 1252 on most systems, so we'll use that for now...

Delphi-Quellcode:
{$IFDEF DOTNET}
function Indy8BitEncoding: TIdTextEncoding;
{$IFDEF USEINLINE}inline;{$ENDIF}
begin
 Result := TIdTextEncoding.GetEncoding(28591);
end;
{$ELSE}
 {$IFDEF USE_ICONV}
function Indy8BitEncoding(const AOwnedByIndy: Boolean = True): TIdTextEncoding;
var
 LEncoding: TIdTextEncoding;
begin
 if not AOwnedByIndy then begin
   LEncoding := TIdTextEncoding.GetEncoding('ISO-8859-1');
 end else
 begin
   if GId8BitEncoding = nil then begin
     LEncoding := TIdTextEncoding.GetEncoding('ISO-8859-1');
     if InterlockedCompareExchangePtr(Pointer(GId8BitEncoding), LEncoding, nil) <> nil then begin
       LEncoding.Free;
     end;
   end;
   LEncoding := GId8BitEncoding;
 end;
 Result := LEncoding;
end;
Ich hoffe, du verstehst unser Problem und kannst mir hierzu noch weiterhelfen.
Wie oben geschrieben brauchen wir unbedingt eine 8bit (1:1) Übertragung.

Viele Grüße
Alex
Angehängte Dateien
Dateityp: zip udpsendsequenz-bds2006_110.zip (288,3 KB, 9x aufgerufen)
Dateityp: zip udpsendreceive-bds2009_155.zip (347,4 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#9

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 15. Jun 2009, 15:35
Hi,

Ich werd mir das Beispiel mal ansehen...

Zitat von AJ_Oldendorf:
Wie oben geschrieben brauchen wir unbedingt eine 8bit (1:1) Übertragung.
1) Dann ist aber das Senden eines Strings eine unglückliche Wahl. Bei der Verwendung von (Unicode-)Strings in D2009 schlägt an vielen Stellen ja auch die Compiler Magic zu und es werden auch teilweise automatische Umwandlungen vorgenommen.

Es besteht doch die Möglichkeit Binärdaten zu übertragen (.SendBuffer) - warum nutzt ihr dies nicht?

2) In D2009 wird Indy8BitEncoding zumindest dort nicht benötigt, senden geht über die D2009 TEncoding Klassen, z.B.
Delphi-Quellcode:
IdUDPServer1.Send('test', 20, 'test', TEncoding.Unicode);
// oder
IdUDPServer1.Send('test', 20, 'test', TEncoding.UTF8);
Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 15. Jun 2009, 16:13
Danke für die schnelle Antwort.
Mit SendBuffer haben wir es auch schon probiert und hatten das gleiche Problem mit der Übertragung.
Wäre super, wenn du dir das Beispiel mal anguckst und mir Bescheid gibst.
Dein zweiten Punkt mit dem Senden gucke ich mir nachher mal an.
Danke im voraus,
Alex
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:26 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