Muss CloseNetworkConnection() sein, wenn der Server....

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Bisonte »

Hallo.

Wenn ich mit OpenNetworkConnection() eine Verbindung mit einem Server hergestellt habe,
und dieser die Verbindung seinerseits unterbricht....

Muss man ein CloseNetworkConnection() anwenden, oder kann man gleich ein neues OpenNetworkConnection()
nehmen um die Verbindung wiederherzustellen ?

Weil eigentlich ist doch die ConnectionID nicht mehr gültig, da die Verbindung ja unterbrochen wurde... oder ist das
der Holzweg ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Sicro »

Code: Alles auswählen

InitNetwork()

#Port = 6002

If CreateNetworkServer(0, #Port)
  connection = OpenNetworkConnection("localhost", #Port)
  If connection
    Repeat
      Select NetworkServerEvent()
        Case #PB_NetworkEvent_Connect
          Debug "Server: Client hat sich zum Server verbunden"
          Delay(5000)
          Debug "Server: Verbindung zum Client wird getrennt..."
          CloseNetworkConnection(EventClient())
        Case #PB_NetworkEvent_Disconnect
          ; Diese Meldung kommt nicht, wenn der Server die Verbindung trennt
          Debug "Server: Client hat sich vom Server getrennt"
      EndSelect
      
      Select NetworkClientEvent(connection)
        Case #PB_NetworkEvent_Disconnect
          Debug "Client: Server hat die Verbindung getrennt"
          CloseNetworkConnection(connection)
      EndSelect
    ForEver
  EndIf
EndIf
Bei mir wird bei dem zweitem CloseNetworkConnection() ein Fehler ausgelöst, daher schlussfolgere ich: kein CloseNetworkConnection()
Getestet unter Linux.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Bisonte »

ok man kann sollte ein CloseNetworkConnection machen.

@Sicro: in deiner Schleife hast du irgendwie vergessen eine neue Verbindung zu öffnen, nachdem vom Server der Disconnect auftritt...

Da keine Fehlermeldung kommt, gehe ich einfach davon aus.

Danke für den "Selbstconnect" Code ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Sicro »

Nein, ein erneutes OpenNetworkConnection() habe ich nicht vergessen, sondern absichtlich weggelassen, weil bereits so sichtbar war, ob man CloseNetworkConnection braucht oder nicht.
Deine Frage war ja, ob CloseNetworkConnection vor der erneuten OpenNetworkConnection erforderlich ist, obwohl NetworkClientEvent = #PB_NetworkEvent_Disconnect ist.
Ich habe also einfach mal CloseNetworkConnection() eingefügt und das Programm stoppte mit einer Fehlermeldung: "Zeile: 23 - Programm abgebrochen (durch eine externe Library). Wobei die externe Library die NetworkLib ist.

Habe ich das richtig verstanden, bei dir kommt kein Fehler bei obigem Code? Merkwürdig :?

Was mir übrigens noch aufgefallen ist: CreateNetworkServer() schlägt manchmal fehl, wenn man den Code unter Linux zu schnell erneut startet. Ob das unter Windows ebenfalls so ist, kann ich gerade nicht testen.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Bisonte »

Nein, bei deinem Code kommt unter Windows keine Fehlermeldung.
Habe dann das OpenNetworkConnection hinzugefügt, damit es jedesmal aufs neue verbindet... und das Delay verkleinert
(1000 ms reicht auch um das zu verfolgen zumindest unter Windows)

Code: Alles auswählen

 InitNetwork()

#Port = 6002

If CreateNetworkServer(0, #Port)
  connection = OpenNetworkConnection("localhost", #Port)
  If connection
    Repeat
      Select NetworkServerEvent()
        Case #PB_NetworkEvent_Connect
          Debug "Server: Client hat sich zum Server verbunden"
          Delay(1000)
          Debug "Server: Verbindung zum Client wird getrennt..."
          CloseNetworkConnection(EventClient())
        Case #PB_NetworkEvent_Disconnect
          ; Diese Meldung kommt nicht, wenn der Server die Verbindung trennt
          Debug "Server: Client hat sich vom Server getrennt"
      EndSelect
     
      Select NetworkClientEvent(connection)
        Case #PB_NetworkEvent_Disconnect
          Debug "Client: Server hat die Verbindung getrennt"
          CloseNetworkConnection(connection)
          connection = OpenNetworkConnection("localhost", #Port)
          If Not connection 
            Break
          EndIf
      EndSelect
      Delay(5)
    ForEver
  EndIf
EndIf 
Dabei hab ich dann gesehen (mit dem Taskmanager) dass die Handles ohne CloseNetworkConnection immer mehr werden... also ist das notwendig.
Mit dem schliessen blieb die Handle - Anzahl stabil. (Wie gesagt, unter Windows)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Sicro »

Jetzt habe ich die Ursache gefunden: Das zweite CloseNetworkConnection() wird nach dem Aufruf beim nächstem Schleifendurchlauf wieder aufgerufen, was dann zu einem Fehler führt, weil die Verbindung ja bereits geschlossen wurde und selbstverständlich nicht nochmal geschlossen werden kann. Windows toleriert diesen Fehler laut deiner Aussage einfach.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Bisonte »

Ich korrigiere : Es kommt keine Fehlermeldung, aber es bleibt an der Stelle stehen... das Programm läuft einfach nicht weiter.

Habe deinen Code unter Linux Mint 17 ausprobiert und dort auch die Fehlermeldung gesehen.
Mit meiner Variante... ist alles so wie es sein soll ...

Allerdings... gibt es bei Linux Mint irgendwie ein Taskmanager ähnliches Programm, damit man sich das ganze mal genauer betrachen kann ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Muss CloseNetworkConnection() sein, wenn der Server....

Beitrag von Sicro »

Bisonte hat geschrieben:gibt es bei Linux Mint irgendwie ein Taskmanager ähnliches Programm, damit man sich das ganze mal genauer betrachen kann
Ja, die Systemüberwachung. Dort den Process mit der rechten Maustaste anklicken, "Offene Dateien" wählen und schon siehst du eine Liste aller offenen Handles (Dateien, Netzwerk usw.).

Die Liste öffnen sich sehr träge, wenn der Process stark beschäftigt ist.
Brauchst du nur die Anzahl der Handles, kannst du diese sehr flott über das Terminal ermitteln:
1. Notiere dir die Process-Kennung aus der Systemüberwachung oder über das Terminal-Programm "top" (dort heißt die Kennung "PID").
2. Führe im Terminal das aus:

Code: Alles auswählen

ls /proc/6794/fd | wc -l
wobei die Nummer die Process-Kennung ist. Als Rückgabe erhältst du dann die Handles-Anzahl des Processes.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Antworten