![]() |
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 |
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.
|
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 |
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.
|
Re: Winsock API disconnect oder Fehler abfangen
Danke dir, ich werde das mal versuchen :)
|
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 |
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. |
Re: Winsock API disconnect oder Fehler abfangen
Zitat:
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 |
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 :) |
Re: Winsock API disconnect oder Fehler abfangen
Habe jetzt folgendes versucht:
Delphi-Quellcode:
Das liefert mir allerdings auch keinen Fehler, wenn der Server abgeschossen wurde.
IOCtlSocket(FSocket, FIONREAD, dwSize)
|
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 |
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? :)
|
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 |
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ß :) |
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