![]() |
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. |
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.
|
Re: Problem mit SendBuf
Zitat:
|
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). |
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.
|
Re: Problem mit SendBuf
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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