Thema "sauberer" Disconnect bei Sockets (TTcpClient/Server)
-
Hallo ich habe eine kurze Frage zu (mal wieder) den Sockets. Als Basiskomponente nehme ich immer noch die TTcpServer/TTcpClient Variante.
Nun Frage ich mich wie ich außerordentliche Disconnects abfangen kann. Trennt die andere Seite die Verbindung sauber
ist die Sache noch relativ einfach, da [ TcpClient1->ReceiveBuf(puffer, puffersize); ] zurückkehrt und 0
zurück gibt. Wenn ich allerdings auf der anderen Seite einfach den Prozess kicke (Absturz simmuliert) passiert dies
nicht. Ich habe ebenfalls bereits in einem Test-Thread mal geschaut ob sich evtl. das Flag von
[ TcpClient1->Connected ] auf false setzt. Passiert allerdings nicht. Die in der Klasse existierenden Events treffen
ebenfalls nicht ein.Nun meine Frage. Gibt es in der Theorie Ansätze wie man ein solches Problem "sauber" abfangen kann?
Ich habe zwar bisher ein Lösungsansatz den ich allerdings als nicht sonderlich "sauber" empfinde und der auch wie ich
finde überflüßige Last erzeugt. Aber vielleicht täusche ich mich da ja auch.Ich könnte, ausgehend von beiden Seite, ein "Ping & Pong" Prinzip einführen. Sendet Seite A ein Ping, so sendet Seite B
ein Pong los. In einer Schleife alle x Sek. Kommt (z.B. X * 2 Sek.) kein Pong von der Gegenseitet nehme ich das als Event
für einen Disconnect. Fahre die Empfangs-Threads runter und nehme die Verbindung als geschloßen hin.
Aber wie bereits gesagt klingt das mehr nach als einer Bastellösung,... oder?Gruß
Slashi
-
Hallo,
im Grunde muss man so verfahren, wie du es schon beschrieben hast, oder man ändert die Kommunikationsabläufe. Das wird eigentlich auch immer so empfohlen, wie z.B. auch hier:
http://tangentsoft.net/wskfaq/newbie.html#abnormalclose
MfG,
Probe-Nutzer
-
Hmm gut ehrlich gesagt hätte ich das nicht gedacht. Aber das würde natürlich erklären warum viele andere Programme auch nicht prombt reagieren wenn ich z.B. eeinfach mal den Netzstecker ziehe. Gut die Variante ist natürlich auch recht einfach zu realisieren. Danke für die schnelle Antwort.
P.S. Eigentlich sollte das ganze ins VCL Forum obwohl es ja auch Sprachenübgreifend Relevanz trägt.
Gruß
Slashi