Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy -TCP: Eine Anzahl bytes lesen... (https://www.delphipraxis.net/103078-indy-tcp-eine-anzahl-bytes-lesen.html)

ralfiii 9. Nov 2007 15:55


Indy -TCP: Eine Anzahl bytes lesen...
 
Hallo!

Ich muss über eine TIdTCPServer-Komponente ein Datenpaket lesen.
Die Grösse des ersten Pakets ist bekannt, und in dem steht dann auch drin wie gross das Folgepaket ist.

Nun könnte ich das über
Delphi-Quellcode:
s:=AContext.Connection.IOHandler.ReadString(SizeOfDataStruct)
machen und nachher den Inhalt des Strings in so eine Struktur reinkopieren.
Nicht so hübsch find' ich.
Dass muss ja wohl irgendwie intelligenter gehen - das ich die reinkommenden Daten direkt irgndwo hinlesen kann. Aber wie?

Da gibt's noch eine Methode ReadBytes aber die erwartet als Buffer ein TIdBytes - also irgendeinen Indy-spezifischen Datentyp. Also auch nicht das Richtige.

generic 10. Nov 2007 04:40

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
ich beziehe mich auf indy 10

ReadString - wie der name schon sagt, liest ein string bis zum #0 char
ReadBytes - ja hast recht musst du hinterher umkopieren
ReadStream - kannst da einen belieben stream übergeben u.a. auch tmemorystream

ralfiii 13. Nov 2007 09:44

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
Zitat:

Zitat von generic
ReadStream - kannst da einen belieben stream übergeben u.a. auch tmemorystream

Danke, den hab ich nun auch genommen.

Interessant find ich: ReadStream hat zwei zusätzliche Parameter, ByteCount und ReadUntilDisconnect.
Was tun die beiden?

Der Name "ReadUntilDisconnect" impliziert (für mich) dass, wenn der Wert true ist, das der erste Wert ignoriert wird und alle Daten bis zum Disconnect gelesen werden. Richtig?

Aber wenn der Wert False ist und ByteCount nicht gesetzt wird?

Wenn ich Daten sende, wird dann irgendwo im TCP/IP-Protokoll mitgeschickt wie gross der Datenblock ist?
Ist es für die Gegenseite ein Unterschied wenn ich BlockA+BlockB sende oder wenn ich zuerst BlockA sende und ein paar millisekunden später BlockB?

wicht 13. Nov 2007 09:48

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
Die Daten werden einfach immer abgeschickt und wie groß die Datenfragmente sind, die die Gegenseite empfängt, kannst du nie im Vorraus wissen. Das bedeutet, du ließt alle Daten in einen Buffer ein, überprüfst diesen auf irgendeine Bedingung (z.B. ein Daten-Ende-Zeichen, das du definiert hast, ist im Buffer, oder eine bestimmte Größe wurde erreicht) und ließt dann aus diesem Buffer. Ich mache es jedenfalls so und das hat sich (bis jetzt :) ) bewährt.

generic 13. Nov 2007 09:53

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
Nein, die Größe des des Datenblocks wird nicht mitgeschickt.
Deine Daten werden in IP Paketet verpackt, diese sind 1500 Bytes Gross bei Gigabit-Ethernet bis zu 3k.
Bei PPPOE sieht das schon anders aus, da sind Pakete nur 1490 Bytes Gross.

Das sind dann auch jeweils die Häppchen welches die Gegenseite Empfäng.
Du solltest dir ein Protkoll ausdenken und dann dieses nutzen.
Bei den meisten Kommunikationen wird ein "Endezeichen" verwendent.
Bei SMTP z.B. eine Textzeile welche nur einen Punkt enthält.

Du kannst aber auch (grosses) XML durch die Gegend schieben und nur auf das Closing-Tag warten.

ralfiii 13. Nov 2007 16:06

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
Danke für die Erklärung.

Jetzt hab ich grad das genau umgekehrte Problem - ich will einfach ein paar Daten rausschreiben.
Angenommen ich hab da eine Datenstruktur, TFoo, ein Record gefüllt mit irgendwelchen Daten.
Wenn ich den nun senden will - ja was dann?

Es gibt keine WriteStream-funktion.
Das einzige was ich auf die schnelle finde ist ein WriteBytes, das TBytes als Parameter erwartet.
Wahnsinnig praktisch! :gruebel:

Muss ich also
Delphi-Quellcode:
var MyBytes : TBytes;
  setlength(MyBytes, sizeof(TFoo));
  system.move(Foo, MyBytes[0], sizeof...)
  WriteBytes(MyBytes)
machen?
Das ist ja komplett Hirnverbrannt?!? Warum fehlt hier die total naheliegende Funktion einfach einen Pointer auf den Beginn der Daten zu übergeben?

Gibt's nix g'scheiteres?

ralfiii 13. Nov 2007 16:13

Re: Indy -TCP: Eine Anzahl bytes lesen...
 
Zitat:

Zitat von ralfiii
Es gibt keine WriteStream-funktion.

Uups, *kleinlaut* - stimmt, die gibt's nicht, aber Write gibt's.
Peinlich! :oops:

Bleibt die Frage warum die Indy-Jungs Pointer so meiden.
Naja, jedenfalls zieh ich meine Schimpferei zurück.


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