AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Indy -TCP: Eine Anzahl bytes lesen...
Thema durchsuchen
Ansicht
Themen-Optionen

Indy -TCP: Eine Anzahl bytes lesen...

Ein Thema von ralfiii · begonnen am 9. Nov 2007 · letzter Beitrag vom 13. Nov 2007
Antwort Antwort
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#1

Indy -TCP: Eine Anzahl bytes lesen...

  Alt 9. Nov 2007, 16:55
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
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.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#2

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

  Alt 10. Nov 2007, 05:40
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
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#3

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

  Alt 13. Nov 2007, 10:44
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?
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#4

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

  Alt 13. Nov 2007, 10:48
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.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#5

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

  Alt 13. Nov 2007, 10:53
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#6

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

  Alt 13. Nov 2007, 17:06
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!

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?
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#7

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

  Alt 13. Nov 2007, 17:13
Zitat von ralfiii:
Es gibt keine WriteStream-funktion.
Uups, *kleinlaut* - stimmt, die gibt's nicht, aber Write gibt's.
Peinlich!

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


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 18:50 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