Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdUDPServer sendet nicht das was er soll (https://www.delphipraxis.net/121270-idudpserver-sendet-nicht-das-er-soll.html)

-TheCoke- 24. Sep 2008 23:14


IdUDPServer sendet nicht das was er soll
 
Hallo!

Ich hab noch ein Problem mit dem Indy UDP Server von Delphi 2009.

Ich schreibe gerade ein mit Delphi 7 erstelletes Projekt in Delphi 2009 neu.

Delphi-Quellcode:
string1 := #$7f#$00#$01#$02#$c2#$00#$00#$00#$00#$01#$00#$00#$08#$00#$00#$00#$00#$00#$00#$00...
string2 := #$00#$00#$02#$00#$00#$00#$00#$00#$00#$00#$02#$00#$00#$00#$00#$00#$00#$00#$00#$00...
UdpServer.Send(ABinding.PeerIP, ABinding.PeerPort,string1 + string2);
Das Problem ist nun, dass beim Client nicht das ankommt was ich absende.

In diesem Fall sind z.B. die ersten 4 Bytes richtig, das 5. Byte ist jedoch $41 anstatt $c2.

In Delphi 7 hat es mit dem gleichen Code wunderbar funktioniert. Ich verstehs nicht.

Coke

sx2008 25. Sep 2008 00:12

Re: IdUDPServer sendet nicht das was er soll
 
Zitat:

Zitat von -TheCoke-
Das Problem ist nun, dass beim Client nicht das ankommt was ich absende.

Der Fehler kann a.) beim Client, b.) beim Server, c.) im Netzwerk oder deren Komponenten oder bei d.) dir selbst (!) liegen.
Nur mit systematischer Fehleranalyse kommst du hier weiter.
Vor allem der Fall d.) ist sehr beliebt. Schon 1000mal gesehen, ein Programmierer ist voll überzeugt irgendetwas müsste so sein. Tage später stellt sich heraus er hat einfach Tomaten auf den Augen gehabt und etwas ganz einfaches übersehen.
Du musst dir einfach selbst misstrauen und alles in Frage stellen und dir selbst misstrauen !!

Schritt 1: was wird Serverseitig wirklich abgeschickt?
Nur wenn du die Daten des Servers in einem String zusammenfasst, in eine Datei speichert und mit einem guten Hexeditor anschaust, kannst du dir selbst beweisen, was der Server versendet.
Delphi-Quellcode:
string1 := #$7f#$00#$01#$02#$c2#$00#$00#$00#$00#$01#$00#$00#$08#$00#$00#$00#$00#$00#$00#$00...
string2 := #$00#$00#$02#$00#$00#$00#$00#$00#$00#$00#$02#$00#$00#$00#$00#$00#$00#$00#$00#$00...
string3 := string1 + string2;
StringToFile(string3, 'C:\server.log'); // mit Hex-Editor prüfen, was in server.log steht !!
UdpServer.Send(ABinding.PeerIP, ABinding.PeerPort,string3);
Hier noch die Hilfsfunktion StringToFile():
Delphi-Quellcode:
procedure StringToFile(const FileName: string; const Contents: AnsiString);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Contents);
    if Len > 0 then
      fs.WriteBuffer(BytesOf(Contents), Len);
  finally
    fs.Free;
  end;
end;
Schritt 2: es gilt das Gleiche wie beim Server: du speicherst die Daten in einer Datei und schaust sie mit einem HexEditor an.

Den weltbesten Hexeditor gibt es hier: http://www.delphipraxis.net/internal...ct.php?t=46184

PS: bei D2009 musst du den Datentyp string in AnsiString ändern und zwar an allen Stellen, an denen du davon ausgehst, dass 1 Zeichen = 1 Byte ist.

-TheCoke- 25. Sep 2008 01:11

Re: IdUDPServer sendet nicht das was er soll
 
Ich hab das mal getestet.

Der Server schickt garantiert schon das Falsche ab.

Edit:

Ich hab jetzt ein Workaround gefunden:

Delphi-Quellcode:
UdpServer.SendBuffer(ABinding.PeerIP, ABinding.PeerPort,BytesOf(string3));
So kommt das Richtige an :gruebel:

sx2008 25. Sep 2008 02:41

Re: IdUDPServer sendet nicht das was er soll
 
Zitat:

Zitat von -TheCoke-
Der Server schickt garantiert schon das Falsche ab. :gruebel:

Könnte sein, dass D2009 die Daten automatisch nach WideString wandelt, weil jetzt string und WideString das Gleiche ist.

molotov13 26. Sep 2008 13:35

Re: IdUDPServer sendet nicht das was er soll
 
Zitat:

Zitat von -TheCoke-
Ich hab das mal getestet.

Der Server schickt garantiert schon das Falsche ab.

Edit:

Ich hab jetzt ein Workaround gefunden:

Delphi-Quellcode:
UdpServer.SendBuffer(ABinding.PeerIP, ABinding.PeerPort,BytesOf(string3));
So kommt das Richtige an :gruebel:

Habe das selbe Problem bei mir auch, jedoch nur unter Windows XP Embedded!? Auf Standard-XP kommt das richtige an. Nun wollte ich deinen Code ausprobieren, jedoch weiss ich nicht, wo diese BytesOf-Funktion zu finden ist.

molotov13 26. Sep 2008 15:06

Re: IdUDPServer sendet nicht das was er soll
 
Problem gelöst, funktioniert nun mit:

Code:
UDPC.SendBuffer(UDPC.Host,UDPC.Port,BytesOf(msg_temp));

Jedoch bekomme ich nichts zurück:

Code:
antwort:TBytes;
...
UDPC.ReceiveBuffer(antwort);
aw := BytesToString(bt2);


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