Forums Neueste Beiträge
 

Daten aus Stream lesen (Socket/TcpIp)

24/05/2008 - 19:16 von Georg Weisse | Report spam
Hi zusammen,

ich empfange über eine Socket-Verbindung (VB 2008) Daten.
Die Daten haben einen unterschiedlichen Umfang (ca. 20 bis 3000 Byte) und
kommen in nicht vorhersehbaren Abstànden (teilsweise unmittelbar
hintereinander, teilweise mit Abstànden von Minuten).

Bislang versuche ich es prinzipiell so:

Const READ_BUFFER_SIZE As Integer = 3000
Client.GetStream.BeginRead(readBuffer, 0, READ_BUFFER_SIZE, AddressOf
DoRead, Nothing)

Das klappt auch so halbwegs.

Mein Problem ist, dass wenn die Daten sehr dicht hintereinander ankommen,
werden sie im selben 'DoRead' aus dem Stream gelesen.
Sind es dabei z.B. 2 * 2000 Byte, bekomme ich die Daten des ersten Sendens
komplett mit den halben Daten des zweiten Sendens am Stück, die andere
Hàlfte der zweiten Daten im nàchsten 'DoRead'.

Gibt es einen eleganteren Weg als alle Daten immer aneinander zu hàngen und
dann (aufwàndig) zu teilen?

Die Daten haben zwar eine 'wiedererkennbare Struktur' sind aber mit nichts
kompatibel.
Für zukünftige Anwendungen gedenke ich das auf XML umzustellen (wofür ich
aber auch keinen 'Zerlegeplan' habe - hierzu sind mir Vorschlàge also auch
sehr willkommen), muss aber momentan noch mit dem bisherigen Datenformat
leben.

Ich hoffe, das dieses Geschreibsel halbwegs verstàndlich ist und Ihr tolle
Vorschlàge für mich habt ;-)

Ciao,
Georg
 

Lesen sie die antworten

#1 Thomas Scheidegger
24/05/2008 - 19:54 | Warnen spam
Hallo Georg

ich empfange über eine Socket-Verbindung (VB 2008) Daten.
Die Daten haben einen unterschiedlichen Umfang (ca. 20 bis 3000 Byte) und
kommen in nicht vorhersehbaren Abstànden
Mein Problem ist, dass wenn die Daten sehr dicht hintereinander ankommen,
werden sie im selben 'DoRead' aus dem Stream gelesen.




so funktioniert ein TCP-Stream nun mal.
('by design', ist nicht .NET/Windows-spezifisch)

Es gibt keinen Zusammenhang zwischen der Datenlànge bei Send/Write
und dem was bei Receive/Read ankommt!
Ein TCP-Stream kennt keine 'Pakete',
sondern nur einen beliebig fragmentierten Byte-Strom.
Die angegebene Datenlànge bei Receive/Read ist nur ein Maximum,
effektiv gelesen (=> Rückgabewert) werden beliebig 1 bis n Bytes
('zufàllig', halt je nach momentaner Verfügbarkeit im OS TCP-Stack)
0 = Stream-Ende.

Garantiert ist bei TCP aber,
dass alle Fragmente ankommen, korrekt und in 'richtiger' Reihenfolge.
Andernfalls gàbe es Exception.

Jegliche Interpretation als 'Pakete' ist Sache deiner Applikation.
Also typisch entweder
- eine fixe Paketlànge im voraus vereinbaren,
- oder im Datenstrom im voraus vereinbarte Delimiter verwenden
(auf Kosten Binàrtransparenz, zB Text: CR/LF Zeilen)
- oder die 'Paketlànge' vorab mit übertragen
(Vorsicht, wenn Làngenfeld > 1 Byte: gibts uU schon hier
Fragmentierung!)

alles _erfordert_ dann entsprechende Logik beim Sender & insbesondere
Empfànger.
(etwa: Schleifen, Byte-Arrays umkopieren oà)

Oder unter .NET mit _synchronen_ Sockets ggf. praktisch:
NetworkStream und: BinaryWriter/Reader oder StreamWriter/Reader
(TextWriter).





Thomas Scheidegger - 'NETMaster'
http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/

Ähnliche fragen