Alternative zu IsConnection()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Alternative zu IsConnection()

Beitrag von jacdelad »

Hallo,
es gibt soweit ich weiß keine Funktion IsConnection(). Wenn ich eine Verbindung öffne, habe ich also nachher keine Möglichkeit zu prüfen, ob die Verbindung noch besteht. Die meines Erachtens einzige Möglichkeit ist auf #PB_NetworkEvent_Disconnect abzufangen (was ich ja sowieso tun sollte). Ein IsConnection() wäre trotzdem irgendwie schön, oder sehe ich das falsch?
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Alternative zu IsConnection()

Beitrag von mk-soft »

Wenn die Verbindung ordnungsgemäß vom Client oder Server getrennt wurde, erhält man ein #PB_NetworkEvent_Disconnect.

Bei Netzwerk Abbruch oder Störung ist es nicht so einfach. Wenn es ein eigenes Protokoll ist, arbeitet man selber mit einem Life Protokoll Ereignis.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von jacdelad »

Ein eigenes Protokoll nutze ich nicht, nur die eingebauten Befehle. Das Problem ist, dass während einer längeren Operation die Netzwerkverbindung abreißen kann, ohne dass die Ereignisschleife durchlaufen wurde. Theoretisch kann das ja immer passieren. SendNetworkData/SendNetworkString liefert dann gleich einen Programmabbruch. Es ist aber keine Option diese Operation in einen Thread auszulagern, weil ich dann die anderen Ereignisse auch abarbeiten müsste.

Schade, da es jede Menge Isxxx-Funktionen gibt wäre das nicht schlecht.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von GPI »

Ich glaub, ihr Redet aneinander vorbei.
Normalerweise verschickst du ja daten hin und her. Normalerweise sendet man ja immer eine Kennung, was man sendet etc. Du müsstes jetzt da ein "Lebst-du-noch"-Nachricht von Server zum Client schicken und der mit "Natürlich" antworten. Quasi ein Ping. Wie man das jetzt in deinen Fall implantiert, kann man ohne zu wissen, was genau du bisher gemacht hast, nicht.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von jacdelad »

Nein, ich glaube ich nicht, dass wir aneinander vorbeireden. Ich kann auch keine Lebensanfrage schicken, wenn der Server nicht mehr lebt, weil SendNetworkData() dann zum Absturz führt.

Ich erklär's mal anders: Ich baue eine Verbindung zu einem Server auf. Mein Programm kommuniziert eifrig mit dem Server vor sich hin Dann steht eine längere Aufgabe an, z.B. eine komplexe Berechnung. In der Zeit werden keine Messages verarbeitet, weil ich ja komplex berechne. Aber genau in dem Moment zieht ein Yeti den Stecker von meinem Server. Da bekomme ich beim Clienten ein #PB_NetworkEvent_Disconnected. Aber ich verarbeite es nicht, weil ich ja gerade komplex berechne. Ich will die Berechnung auch nicht in einen Thread auslagern, weil ich in dem Moment keine anderen Messages verarbeiten will, das will ich erst danach. So, jetzt muss nach der komplexen Berechnung das Ergebnis an den Server geschickt werden (von dem ich ja ausgehe, dass er noch aktiv ist). Geht aber nicht und ich hab keine Möglichkeit zu wissen ob er noch da ist, weil ich #PB_NetworkEvent_Disconnected noch nicht abgearbeitet habe. Das Programm stirbt.

Ich könnte natürlich eine OnError-Abfrage machen, aber das ist unelegant. Deshalb hatte ich gedacht, dass es analog zu IsFTP() und anderen Funktionen eine Möglichkeit gibt, die mir sagt, ob eine Verbindung noch da ist. Hintergrund ist auch folgender, dass ich nicht nur mit einem Server, sondern mit 28 kommuniziere.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von GPI »

alternativ könntest du vor den Senden überprüfen, ob Nachrichten anliegen und die erst abarbeiten, bis keine mehr anliegt.
Du könntest dein Ergebnis in einen Senden-Buffer packen, der erst abgearbeitet wird, wenn die Nachrichten durch sind und gegebenfalls das Ergebnis verwirft.
Generell würde ich empfehlen, alle Nachrichten regelmäßig abzufragen, sonst hängt dein Programm. Pack die ganze Nachrichten-Routinen in eine eigene Procedure, verwende WindowEvent() statt WaitWindowEvent() und streu es in deine Berechnung rein. Klar, wird etwas langsamer, aber du kannst dann halt noch auf verschiedenes Reagieren. Fenster etc. sollte man aber per DisableWindow() etc. abschalten, so das keine Usereingaben erfolgen können. Quasi Cooperatives Multitasking ;)
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von jacdelad »

Ja, nein, ja. Das ist mir alles klar. Bei 28 Servern ist nur schwer den Überblick zu behalten. Ich will auch nicht irgendwelche Nachrichten zwischenspeichern. Ich wollte im Endeffekt nur mal aufzeigen, dass es kein IsConnected() gibt und ich denke das wäre in Anbetracht von IsGadget(), IsFTP(), Isxxx()...eine gute Idee. Scheinbar hat ihr diese Probleme nicht, das erklärt vielleicht warum Fred das nicht implementiert hat.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von NicTheQuick »

Wenn eine Netzwerkverbindung ohne Ansage ausfällt (zum Beispiel Stecker gezogen, IP gewechselt, WLAN schlecht oder abgerissen), dann gibt es keine Möglichkeit herauszufinden, ob die Verbindung noch existiert oder nicht. IsConnection() könnte niemals eine korrekte Antwort geben. Genauso gut könnte es passieren, dass die Verbindung plötzlich wieder steht. Es liegt an der Anwendung zu entscheiden, ob die Verbindung verworfen werden soll oder nicht. Dafür kann man sich seine eigenen Timeouts definieren.

Prinzipiell sollte man jede Netzwerkverbindung in einem eigenen Thread auslagern. Nur so ist man auf der sicheren Seite. Leider ist Purebasic dafür nicht ausgelegt, da NetworkServerEvent() nicht an eine Verbindung gekoppelt ist, sondern an den Server selbst. Die Funktion muss also in dem selben Thread aufgerufen werden, in dem auch der Server erstellt wurde, vorzugsweise im Mainthread.

Schlaue Leute haben hier aber schon fertige Lösungen in Form von Includes gepostet, die den kompletten Network-Stack von Purebasic kapseln und handhabbar machen. Auswendig weiß ich aber gerade nicht, wo dieses Include zu finden ist.
Bild
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Alternative zu IsConnection()

Beitrag von jacdelad »

Ah verstehe. Vielen Dank, da schaue ich mich mal um.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Alternative zu IsConnection()

Beitrag von mk-soft »

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten