Asynchrone TCP-Übertragung unter Stress

24/10/2008 - 10:33 von Peter Maier | Report spam
Guten Morgen zusammen,

ich übertrage über einen TCPListener und TCPClients Nachrichtenstrings. Wenn
Übertragungen nun in sehr kurzen Abstànden aufeinanderfolgen, dann werden
diese auf der Empfangsseite nicht mehr zeilenweise empfangen, so wie sie
eigentlich abgeschickt wurden. Der Empfànger muß die Nachrichten aber
zeilenweise auswerten. Es passiert also, daß die ersten Zeichen einer neuen
Übertragung, beim Empfànger an der Vorgànger-Nachricht drankleben und die
Auswertung deswegen scheitert.

Also etwa:

{I N F O R M A T I O N A B C}
{I N F O R M A T I O N X Y}{I N F
O R M A T I O N E B Z}

[1] Ist das ein notwendiges Übel, das man sich einhandelt, wenn man den
Empfang asynchron gestaltet?

[2] Làßt sich das irgendwie Sicherstellen, daß die Nachrichten am Stück,
getrennt voneinander empfangen werden?

[3] Falls man dagegen prinzipiell nichts tun kann und die Übertragung
synchron zu erfolgen hat, làßt sich das mit wenigen Änderungen realisieren
(z.B. Read statt BeginRead, etc.) oder erfordert das weitgehende
Neuprogrammierung?

Mit freundlichen Grüßen,

Peter Maier
 

Lesen sie die antworten

#1 Thomas Scheidegger
24/10/2008 - 11:17 | Warnen spam
Hallo Peter

ich übertrage über einen TCPListener und TCPClients Nachrichtenstrings.
Wenn Übertragungen nun in sehr kurzen Abstànden aufeinanderfolgen,
dann werden diese auf der Empfangsseite nicht mehr zeilenweise empfangen




dies ist nicht wegen asynchroner-IO,
sondern ganz grundsàtzlich 'by design',
weil TCP-Sockets ja Stream-orientiert (Byte-Strom) arbeiten.
[nicht nur in .NET, sondern nach RFC-Standard]
Es gibt da keine explizite 'Pakete' (oder 'Zeilen').

Entweder definierst du selber einen 'Delimiter'
(zB CR/LF für Zeilen)
mit entsprechender Empfangs-Logik,
oder (zB für Binàr-Protokolle)
man sendet vorab zusàtzlich eine Làngen-Angabe
('Header', wobei dieser falls >1Byte auch fragmentiert werden könnte!)
und Empfangs-Logik.


Für synchron gàbe es ggf noch Hilfen wie
StreamWriter.WriteLine / StreamReader.ReadLine



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen