Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi IdTCPClient ReadBytes (https://www.delphipraxis.net/176343-idtcpclient-readbytes.html)

SyntaxXx 28. Aug 2013 19:52

IdTCPClient ReadBytes
 
Guten Abend, wieder habe ich eine Frage.

Ich sende via IdTCPClient.IOHandler.Write() ein Paket an einen Server.
Direkt danach erwarte ich eine Antwort vom Server.

Doch wie lese ich die Antwort jetzt?


Ich habe es mit IdTCPClient.IOHandler.ReadBytes() versucht, aber bekomme dann nichts gescheites raus.
Hier mal ein wenig Code:

Delphi-Quellcode:
var bytes: TIdBytes;
Delphi-Quellcode:
  IdTCPClient1.IOHandler.ReadBytes(bytes, 16);

  for i := Low(bytes) to High(bytes) do
    resp := resp + chr(bytes[i]);

  //resp := BytesToString(bytes, 8);
  showmessage(resp);
Hier ergeben sich aber jetzt mehrere Probleme.
1. Ich erhalte immer eine leere Messagebox.
2. Ist wenn ich das richtig verstanden habe die Antwort nun auf 9 Zeichen begrenzt (0...8).
Da ich aber nicht weiß, wie lang die Antwort ist, ist diese Lösung nicht wirklich zufriedenstellend.


Was also tun?

supermuckl 29. Aug 2013 08:45

AW: IdTCPClient ReadBytes
 
schick doch einen stream
dann ist die länge auch bekannt wenn die intern vor dem stream als int mitgeschickt wird

SyntaxXx 30. Aug 2013 07:15

AW: IdTCPClient ReadBytes
 
Das Problem ist, dass die Antwort von einem fremden Server kommt und ich keinen Einfluss darauf habe.
Somit könnte ich zwar die Länge mit senden, würde aber keine bei der Antwort bekommen.

supermuckl 30. Aug 2013 08:25

AW: IdTCPClient ReadBytes
 
naja, irgendwas muss es geben
es gibt 3 möglichkeiten bei datenübertragung mit tcp/udp
1. es ist auf beiden seiten bekannt, wie groß das paket ist - es wird auf empfängerseite genau X bytes gelesen vom buffer
2. es werden terminierte byteketten verschickt, womit auf empfängerseite erkannt werden kann, wann aufgehört werden kann mit lesen aus dem buffer (bei writeln z.b.)
3. es wird die länge des konstrukts vor den eigentlichen daten mitgeschickt - die länge ist auch in einem definierten format (hat auch eine länge) z.b. int oder int64 usw..

wenn keines der drei möglichkeiten bei deiner gegenstelle vorhanden sind, sehe ich schwarz

schau dir doch mal die pakete mit wireshark an und achte auf abschlusszeichen oderso
bzw nullzeichen, auffüllzeichen (falls feste paketgröße)


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