Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Winsock API disconnect oder Fehler abfangen (https://www.delphipraxis.net/98965-winsock-api-disconnect-oder-fehler-abfangen.html)

Zacherl 4. Sep 2007 18:44


Winsock API disconnect oder Fehler abfangen
 
Hey,

kann ich mir mit der winsock API irgendwie ein OnError Event basteln so wie es beispielsweise in der TClientSocket Klasse enthalten ist?

Gruß Zacherl

nitschchedu 4. Sep 2007 19:10

Re: Winsock API disconnect oder Fehler abfangen
 
In grunde genohmmen schon ... aber dann müsstest du das in Klassen aufbauen sonst würd das nix.

Zacherl 4. Sep 2007 20:34

Re: Winsock API disconnect oder Fehler abfangen
 
Geht mir jetzt nicht speziell um ein Event, sondern mehr um die Art und Weise wie ich rausbekommen kann, ob die Verbindung überhaupt noch steht.
Wird mein Server beispielsweise über den Taskmanager abgeschossen, wird nicht ordnungsgemäß "disconnect" aufgerufen und mein Client bekommt gar nichts mit :D

nitschchedu 4. Sep 2007 21:35

Re: Winsock API disconnect oder Fehler abfangen
 
Naja da du einen brauchst Thread prüfst du mit "ioctlsocket" ob was ankommt, sollte in der Zeit der Socket disconnecten gibt die Funktion ein Fehler Code zurück, den wertest du einfach nur aus.

Zacherl 5. Sep 2007 06:16

Re: Winsock API disconnect oder Fehler abfangen
 
Danke dir, ich werde das mal versuchen :)

oki 5. Sep 2007 06:42

Re: Winsock API disconnect oder Fehler abfangen
 
Hi zacherl,

imho ist es so, dass eine Socket-Verbindung nicht automatisch prüft, ob der verbundene Teilnehmer noch aktiv ist. Besteht eine connection, so gehen alle Teilnehmer davon aus, dass diese auch aktiv ist. Eine aktive Benachrichtigung des Beendens erfolgt nur über den disconnect. Stürzt ein Teilnehmer ohne disconnect ab, so werden alle anderen hiervon nicht informiert. Ich habe dieses Problem über ein eigenes Benachrichtigungsprotokoll (ähnlich Ping) gelöst. Hast du nicht die Möglichkeit so etwas zu implementieren, besteht zusätzlich die Einrichtung eines Timeout. Bekommt eine Socket eine festgelegte Zeiteinheit keine Daten (Timeoutzeit), wird die Verbindung aktiv getrennt.
Ich muß aber auch zugeben, dass ich mit ioctlsocket noch nicht gearbeitet habe.

Gruß oki

Zacherl 5. Sep 2007 09:03

Re: Winsock API disconnect oder Fehler abfangen
 
Ich hatte es mal so gelöst, dass ich einfach immer nach einiger Zeit irgendwelche Müll Daten versucht habe zu schicken und wenn das Socket einen Fehlercode zurückgegeben hat, wusste ich, dass die Verbindung abgebrochen ist. Allerdings hat das meinen regulären Datenverkehr gestört und war zudem noch recht instabil ..
Ich werde es später, wenn ich zu Hause bin erstmal mit ioctlsocket versuchen.

oki 5. Sep 2007 09:55

Re: Winsock API disconnect oder Fehler abfangen
 
Zitat:

Zitat von Zacherl
Ich hatte es mal so gelöst, dass ich einfach immer nach einiger Zeit irgendwelche Müll Daten versucht habe zu schicken und wenn das Socket einen Fehlercode zurückgegeben hat, wusste ich, dass die Verbindung abgebrochen ist.

Meine Erfahrung ist, dass für eine "nicht ordnungsgemäß" getrennte Verbindung ebend genau keine Fehlermeldung kommt. Imho geht es nur so, dass z.B. der Client in definierten Zeitabständen eine Info (zum Bsp. "ping" oder anderer Identifier) an den Server sendet. Erhält der Server nach Timeout keine Message vom Client, wird die gehaltene Socketverbindung getrennt. Das gleiche gilt auch umgekehrt. Nach entsprechenden disconnectes beider Seiten muß der Client versuchen eine neue Verbindung zum Server aufzubauen. Wenn das dann nicht klappt, kommt eine Fehlermeldung auf die man entsprechend reagieren kann.

Das heisst also, der Server wartet auf ein connect und trennt bei Inaktivität. Der Client macht das gleiche, versucht aber nach Disconnect eine neue Verbindung zu etablieren.

Gruß oki

Zacherl 5. Sep 2007 14:29

Re: Winsock API disconnect oder Fehler abfangen
 
Jaja, ich glaube wir reden aneinander vorbei :D Meine Erfahrungen haben das selbe gezeigt. Ich meine nur einen Lösungsansatz von mir, in welchem ich zwar keine richtige PING PONG Funktion eingebaut hatte, sondern ich habe einfach versucht irgendwas an den Server zu schicken.
In diesem Falle hat der Client aber gemerkt, wenn der Server geschlossen wurde und einen Errorcode zurückgegeben. Dies allerdings erst im Falle eines Datentransfers. Von alleine kommt überhaupt keine Fehlermeldung.

Um 7 bin ich ca wieder zu Hause, dann sehe ich mir mal die ioctlsocket API an und erstatte Rückmeldung :)

Zacherl 5. Sep 2007 19:28

Re: Winsock API disconnect oder Fehler abfangen
 
Habe jetzt folgendes versucht:
Delphi-Quellcode:
IOCtlSocket(FSocket, FIONREAD, dwSize)
Das liefert mir allerdings auch keinen Fehler, wenn der Server abgeschossen wurde.

oki 5. Sep 2007 19:37

Re: Winsock API disconnect oder Fehler abfangen
 
Da das IP ein Paketorientiertes Protokoll ist und die Socketkomponente imho keine "interne" Kommunikation pflegt kann ich mir auch schlecht vorstellen, dass das funzt. Die Gegenseite zu erreichen sollte nur über die eine eigene Kommunikation (wie vorher beschrieben) klappen.

Gruß oki

Zacherl 5. Sep 2007 19:49

Re: Winsock API disconnect oder Fehler abfangen
 
Ist mir auch schleierhaft wie es gehen könnte. Vielleicht sagst du uns, wie du es realisiert hast nitschchedu? :)

oki 5. Sep 2007 20:20

Re: Winsock API disconnect oder Fehler abfangen
 
Hi,

so wie beschrieben, der Client schickt alle 4 Min. (bei mir reicht das) einen Standardtext ("Ping"). Der Server erwartet diesen vom Client. Bleibt er aus, do disconnecte ich die Clientverbindung im Server. Das gleiche natürlich auch in Richtung Client. Ist die Verbindung unterbrochen, kümmert sich der Server nicht weiter drum. Der Client versucht periodisch den Server neu zu connecten. Klappt das nicht, kein Netz, kein Server etc. wirft die ClientSocket auf jeden Fall einen Error. Der kann abgefangen werden. Der Status bleibt im Fehlerfall immer auf dixconnect.

Schlussendlich unterstellt man, dass so lange mann Infos empfängt (beide Seiten) ist alles i.O. Wird eine Zeit lang (über Timeout) nichts empfangen, so stimmt was nicht und die Verbindung wird aktiv unterbrochen (Disconnect).

Natürlich kann man den Timer für den "Ping" nach dem Senden zurücksetzen. Es werden ja Daten empfangen/gesendet. Der "Ping" ist nur ein Ersatz, wenn man in der geforderten Zeit halt nichts zu senden hat. Man kann auch als Standardtext "Ich lebe noch!" :lol: nehmen.

Gruß oki

Zacherl 5. Sep 2007 21:24

Re: Winsock API disconnect oder Fehler abfangen
 
Ah jetzt ist mir ein Konzept eingefallen .. ich lasse den Client einfach jede 10 Sekunden ein Datenpaket erwarten. Wenn der Server grade keine Pakete an den Client sendet, wird ersatzweise alle 10 Sekunden ein einzelnes Byte gesendet ..
Danke für den Anstoß :)

oki 5. Sep 2007 22:09

Re: Winsock API disconnect oder Fehler abfangen
 
Jooop,
so wars gemeint :thumb:

Gruß oki


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