AGB  ·  Datenschutz  ·  Impressum  







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

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 2 von 2     12   
Assertor

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

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 16. Jun 2009, 10:39
Hi Alex,

Zitat von AJ_Oldendorf:
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.
So, ich habe mir das gerade mal angesehen. Meine Vermutung bezüglich des Encodings stimmt. Allein schon die Tatsache, daß der Compiler Warnungen bezüglich der String-Umwandlung schmeißt, sollte dem Programmierer immer zu denken geben.

Wenn Du in Deinem D2009 Beispiel folgendes änderst, geht es sofort - aber bitte trotzdem unten weiterlesen:
Delphi-Quellcode:
// Senden:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  outMsg: String[2];
begin
  Inc(Counter);
  outMsg[0] := AnsiChar(2);
  outMsg[1] := AnsiChar(Hi(Counter));
  outMsg[2] := AnsiChar(Lo(Counter));

  // IdUDPClient1.Send(outMsg, Indy8BitEncoding);
  IdUDPClient1.Send(outMsg, TEncoding.Unicode); // Delphi Encoding nutzen!
  Label3.Caption := 'Sending: ' + IntToStr(Counter);
end;

...

// Empfangen:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TBytes; ABinding: TIdSocketHandle);
var
  InData : AnsiString;
  tmpword: Word;
begin
  InData := BytesToString(AData, TEncoding.Unicode); // Delphi Encoding nutzen!

  if (InData = '') or (Length(Indata) < 2) then
  begin
    Memo1.lines.Add('Invalid value');
  end
  else begin
    // Read Word from ByteArray
    tmpword := (Ord(InData[1]) shl 8) or
                Ord(InData[2]);

    Memo1.Lines.Add(IntToStr(tmpword));
  end;

end;
Aber wie gesagt, das so zu nutzen wäre sehr unschön. IdUDPClient1.Send hat als 1. Übergabeparameter einen String. Was glaubst Du also, macht Delphi, wenn Du dort einen Ansi oder ShortString übergibst? Richtig, es konvertiert diesen zu einem UnicodeString.

Der richtige Weg, diese Binärdaten zu übertragen wäre z.B.:
Delphi-Quellcode:
// Senden:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  outData: TBytes;
begin
  Inc(Counter);

  SetLength(outData, 2);
  outData[0] := Hi(Counter);
  outData[1] := Lo(Counter);
  IdUDPClient1.SendBuffer(outData);

  Label3.Caption := 'Sending: ' + IntToStr(Counter);
end;

...

// Empfangen:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  AData: TBytes; ABinding: TIdSocketHandle);
var
  tmpword: Word;
begin
  if Length(AData) < 2 then
  begin
    Memo1.lines.Add('Invalid value');
    // Raise EProgrammerNotFound.Create('nicht da');
  end
  else begin
    // Read Word from ByteArray
    tmpword := (Ord(AData[0]) shl 8) or
                Ord(AData[1]);

    Memo1.Lines.Add(IntToStr(tmpword));
  end;
end;
Und da gibt es dann natürlich auch keine Warnung mehr wegen irgendwelcher String-Conversions. Es werden direkt und unverändert Bytes übertragen.

Das Problem hat nichts, wirklich garnichts mit Indy zu tun. Die Speicherung von Binärdaten in einem String und die daraus folgenden Probleme, kommen seit Delphi 2009 jetzt in vielen Sourcen ans Tageslicht. Ich empfehle dringend mal die Leitfäden bezüglich der D2009 Unicode-Umstellung von Embarcadero, da hier wirklich hilfreiche Infos drin stecken (einfach mal im EDN suchen).

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#12

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 16. Jun 2009, 10:43
Hallo Assertor,
danke für deine Infos. Wir haben hier gestern auch noch ein wenig gebastelt und sind dann auch auf die Idee gekommen, es direkt umzuwandeln und dann über SendBuffer auszugeben.
Wie du schon sagtest, gehts dann auch.

Wir hatten dass anscheind irgendwo übersehen mit der Compilermeldung und sind dann eben nicht direkt darauf gekommen wegen der Unicode-Umwandlung.

Danke trotzdem für deine Hilfe.
Viele Grüße
Alex
  Mit Zitat antworten Zitat
Assertor

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

Re: Indy10 Kommunikation über UDP mit 8 Bit Codierung

  Alt 16. Jun 2009, 10:57
Zitat von AJ_Oldendorf:
Wir hatten dass anscheind irgendwo übersehen mit der Compilermeldung und sind dann eben nicht direkt darauf gekommen wegen der Unicode-Umwandlung.

Danke trotzdem für deine Hilfe.
Keine Ursache, freut mich helfen zu können!

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 05:21 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