AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Stream über TCP - Blockaufteilung ?
Thema durchsuchen
Ansicht
Themen-Optionen

Stream über TCP - Blockaufteilung ?

Ein Thema von Stefanie · begonnen am 3. Dez 2009 · letzter Beitrag vom 8. Dez 2009
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

Re: Stream über TCP - Blockaufteilung ?

  Alt 5. Dez 2009, 14:11
Message Framing wäre das Suchwort für Google.
Der Absender sendet einzelne Messages (=Botschaften, Befehle, Commands) in einen TCP/IP Stream und der Empfänger hat die Aufgabe
die einzelnen Messages auch dann sauber zu trennen, wenn er immer nur einzelne Bruchstücke bekommt.
Im Extremfall tröpfeln die Bytes einzeln ein.

Dazu kenne ich drei Varianten
1.) feste Blockgrösse, Sender und Emfänger vereinbaren eine feste Blockgrösse
Messages, die kleiner sind werden mit Leerzeichen oder #0 aufgefüllt
2.) Jede Message wird mit CR/LF abgeschlossen
3.) Jede Message beginnt mit einem 4-Byte Int, in dem die Anzahl der folgenden Nutzdaten vermerkt ist

Variante 1.) ist sehr unflexibel, Variante 2.) hat Vorteile beim Debuggen aber problematisch für binäre Daten
und Variante 3.) eignet sich am Besten für grosse binäre Daten

Das Grundprinzip wie man die Messages beim Empfänger bildet ist aber immer das Gleiche.
Man braucht einen globalen Puffer für die Verbindung.
Ich bevorzuge AnsiStrings, weil man sich so nicht um die Reservierung und Freigabe von Speicher kümmern braucht.

Wenn ein neues Stück des TCP/IP Stream eintrifft, hängt man es an die bisherigen Daten an:
buffer := buffer + newdata; Dann beginnt die Suche, ob im Puffer eine vollständige Message steckt.
Für den Fall der Variante 2.) sähe das so aus:
Delphi-Quellcode:
p := Pos(#13#10, buffer)
if p <> 0 then
begin
  // Message gefunden
  Message := Copy(buffer, 1, p-1); // Message rauskopieren
  Delete(buffer, 1, p+1); // und im Puffer löschen
end;
Die Message könnte nun über ein Event verarbeitet werden.
Aber halt, wir sind noch nicht fertig!
Es könnten weitere Messages im Puffer stecken.
Mit einer Repeat....Until Schleife prüft man so lange, bis man feststellt, dass keine weiteren Messages im Puffer stecken.
Danach ist der Puffer leer oder es steckt noch eine unvollständige Message im Puffer.

Man sollte eine maximale Message - Grösse definieren, um sich vor Denial-of-Service Angriffen zu schützen.
Wird die max. Grösse überschritten, wird die Verbindung getrennt.

Da bei einer TCP/IP-Verbindung Daten üblicherweise in beide Richtungen verschickt werden,
müssen beiden Seiten dieses Verfahren zum Message Framing implementieren.

[edit]link hinzu[/eddit]
fork me on Github
  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 19:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz