Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   ClientSocket: Welches Ereignis nach erfolgreichem Schreiben? (https://www.delphipraxis.net/204078-clientsocket-welches-ereignis-nach-erfolgreichem-schreiben.html)

Caps 21. Apr 2020 16:07

ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Hallo,

ich habe mal eine Verständnisfrage, weil ich nichts dazu gefunden habe:

Ich verwende einen ClientSocket, um Daten mit der Methode Socket.SendText in eine TCP-Verbindung zu schreiben. Das funktioniert auch, jedoch würde ich gern darauf reagieren, wenn der Schreibvorgang erfolgreich abgeschlossen ist.
Ich stehe momentan leider auf dem Schlauch, da das einzige Ereignis, welches so klingt als sei es dafür gemacht (OnWrite) lt. Delphi-Hilfe dazu gedacht ist, einen Schreibvorgang auszulösen, statt darauf zu reagieren.

Danke für einen kleinen Stupser in die richtige Richtung! :)

lg Caps

hoika 21. Apr 2020 16:25

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Hallo,
das nennt sich Protokoll.
Du selbst legst fest, wenn das Schreiben beendet ist.
Z.B. Mit einem Endezeichen (#1310 z.B.

himitsu 21. Apr 2020 17:39

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Jo, "Protokol" = Definition wie die Daten in deinem Stream/Socket aufgebaut sind.

Wie bereits erwähnt, kannst du ein "beliebige" Endezeichen/-zeichenfolge definieren, welches natürlich nicht in den "normalen" Daten enthalten sein darf, bzw. was dort entsprechend maskiert wird.
Und beim lesen dann so lange, bis du zu diesem Zeichen/Zeichenfolge kommst.

Alternativ kann man auch zu Beginn hinschreiben, wie lang die nachfolgenden Daten sind.
z.B. mit "nummer"+Endezeichen oder besser gleich als Byte, Word, LongWord/Integer oder sonstwas mit fester Länge.
Dann am Ziel erst die Länge einlesen und dann weißt du schon vorher, wieviele Daten nun kommen.

ps: Bei Zeilenumbruch als Trennzeichen, da könnte man auch sowas wie TidTelnet verwenden (den Port darf man nach belieben verändern),
denn das ist ein Socket, wo einzelne "Befehle" als "Zeile" übertragen werden. :stupid:

Caps 22. Apr 2020 08:42

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Hi, danke für Eure Antworten!

Das Problem ist aber leider anders gelagert.
Es ist so, dass das Schreiben in die Verbindung ja je nach Netzwerkqualität kürzer oder länger dauern kann.
Wenn ich aber den Socket vernichte oder die Anwendung schließe ohne zu wissen, ob bereits alles geschrieben worden ist, dann hacke ich unter Umständen die Übertragung ab, obwohl ich noch warten könnte, wenn ich nur wüsste dass er "noch schreibt".

Es gibt für diese Verbindung übrigens ein Protokoll, das Problem ist, dass der Server schon mitkriegt, wenn er alles hat, aber wie kriegt's der Client mit? Der Server ist nicht von mir sondern von einer anderen Firma, da kann ich nix am Verhalten des Servers ändern oder so, leider.

lg Caps

scrat1979 22. Apr 2020 12:15

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Es gibt Komponenten die lösen das Event erst aus wenn alle Daten empfangen wurden und nicht nach jedem „Paket“. Ich benutze die sgcWebSockets. Eventuell hilft es dir weiter...

TurboMagic 22. Apr 2020 13:33

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Ich glaube dem Fragesteller geht es darum mitzubekommen, wann sein ClientSocket alle Daten WIRKLICH verschickt hat.
Denn erst dann sollte er geschlossen werden.

Dein Ansatz wäre, dass die Komponente erst dann ein Event auslöst, wenn das ACK für das Paket empfangen wurde?
Das wird aber sicher in die Hose gehen, da bei TCP ein ACK meist erst nach mehreren Paketen gesendet wird.

Caps 22. Apr 2020 13:55

AW: ClientSocket: Welches Ereignis nach erfolgreichem Schreiben?
 
Zitat:

Zitat von TurboMagic (Beitrag 1462695)
Ich glaube dem Fragesteller geht es darum mitzubekommen, wann sein ClientSocket alle Daten WIRKLICH verschickt hat. [..]

Ja :-D, das ist in der Tat meine Frage.
Ich werte jetzt notgedrungen das Eintreffen der Serverantwort (OnRead) als Signal, dass der Client mit Schreiben fertig ist, das ist besser als nix, aber hm...

lg Caps


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