Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit SendBuf (https://www.delphipraxis.net/108741-problem-mit-sendbuf.html)

hugo1990 18. Feb 2008 20:30


Problem mit SendBuf
 
Wenn man mit den Komponenten TServerSocket und TClientSocket Text über SendText versendet, kann es ja passieren, dass wenn ich den Text mit ReciveText aufrufe mehrere Texte zu einem zusammengeführt worden.
z.B.:
SendText('hallo');
SendText('wie geht''s');
ergibt : ReciveText('hallowie geht''s');

passiert diese Sache auch bei SendBuf, denn bei meinem Programm kommt es öfters mal vor, dass einige Daten verloren gehen, vorallem wenn mehrere male schnell hintereinander SendBuf aufgerufen wird. Ich habe den Verdacht, das dadurch die Daten von der vorherigen Sendung mit den neuen überschrieben werden, ohne das die alten verwendet werden konnten. Ist das der Fall? Und wenn ja, was kann man dagegen unternehmen.
Ach ja und bitte sagt jetzt nicht alle: "Verwende doch die Indykomponenten", dazu hab ich jetzt schon zu viel geschrieben, um das noch umzuändern.

Apollonius 18. Feb 2008 20:34

Re: Problem mit SendBuf
 
Das ist eben TCP: Es wird ein Stream gesendet, die Reihenfolge bleibt erhalten, aber die Einteilung in Pakete ist nicht global. Das lässt sich nicht durch andere Komponenten oder andere Methoden lösen, sondern nur durch ein Protokoll.

hugo1990 18. Feb 2008 20:40

Re: Problem mit SendBuf
 
Zitat:

Zitat von Apollonius
Das ist eben TCP: Es wird ein Stream gesendet, die Reihenfolge bleibt erhalten, aber die Einteilung in Pakete ist nicht global. Das lässt sich nicht durch andere Komponenten oder andere Methoden lösen, sondern nur durch ein Protokoll.

Soll das jetzt heißen, das da mehrere Buffer zusammen gepackt sein können, wenn ja, wie kann man die "zerpflücken".

Muetze1 18. Feb 2008 21:44

Re: Problem mit SendBuf
 
Genau darum muss sich dein Protokoll kümmern. Die Socket Komponenten übertragen einfach nur die Daten. Sie sorgen für die richtige Reihenfolge der Bytes. Wie und in welcher Teilung du was absendest, ist den Komponenten vollkommen egal, sie übertragen nur Bytes. Auch SendText()/SendBuf() unterscheiden sich nur in dem Typ, wie sie die Daten annehmen. Es sind weiterhin für den Socket nur Bytes, d.h. mit SendBuf() gesendete Daten kannst du genauso mit ReceiveText() empfangen.

Du hast darum zu kümmern, dass du weisst:

a) ob du alle nötigen Daten empfangen hast, bzw. wieviele Bytes noch fehlen
b) wie die Daten organisiert sind
c) welche Daten wo und wann über den Socket verschickt werden.

Selbst wenn du einmal "Hallo" mit SendText() versendest, kannst du im schlechtesten Falle 4x im OnClientRead aufgerufen werden mit jeweils nur einem Buchstaben, bis du alles empfangen hast.

Mal anders: Die Socket Komponenten senden und empfangen Bytes, ohne irgendwelche Daten hinzu zu fügen oder zu interpretieren. Von daher kannst du damit viele Dinge implementieren, bzw. viele Protokolle. Damit kannst du ein FTP Protokoll genauso wie SMTP implementieren. Wenn der Socket deine Teile (wie du es dir wünscht) am anderen Ende wieder entsprechend Teilen soll, dann bräuchte er auch Informationen wo und wie die Teile zu teilen sind (also ein Protokoll). Somit: er müsste die übertragenen Bytes verändern (was anhängen), damit das klappt. Damit würden diese Komponenten aber sofort unbrauchbar, wenn man Protokolle implementieren will (wie z.B. die oben genannten).

hugo1990 19. Feb 2008 15:10

Re: Problem mit SendBuf
 
ok also ich habe mich jetzt entschieden, das ganze über SendText zu realisieren, da man dort ja meiner Meinung nach die nachrichten wesentlich einfacher voneinander trennen kann, nämlich indem ich einfach ein Trennzeichen dazwischen setze.

Muetze1 19. Feb 2008 15:19

Re: Problem mit SendBuf
 
Zitat:

Zitat von hugo1990
ok also ich habe mich jetzt entschieden, das ganze über SendText zu realisieren, da man dort ja meiner Meinung nach die nachrichten wesentlich einfacher voneinander trennen kann, ...

Du könntest an die Daten die du an SendBuf() übergibst auch einfach noch was dranhängen vor dem Aufruf...

Zitat:

Zitat von hugo1990
..., nämlich indem ich einfach ein Trennzeichen dazwischen setze.

Was schon ein Protokoll darstellt.


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