Seite 1 von 1
Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 00:33
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 ?
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 11:12
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.
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 12:08
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

Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 15:05
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.
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 15:34
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)
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 16:02
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.
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 16:20
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 ?
Re: Muss CloseNetworkConnection() sein, wenn der Server....
Verfasst: 15.06.2014 17:06
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:
wobei die Nummer die Process-Kennung ist. Als Rückgabe erhältst du dann die Handles-Anzahl des Processes.