Seite 1 von 1
Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 29.12.2009 12:21
von Terminal
Hallo,
ich habe mir einen simplen Server und einen Client geschreiben. Der Client baut ständig Verbindungen zu meinem lokalen Server auf und schließt sie wieder. Dies soll eine echte Verwendung des Servers durch viele Computer simulieren. Leider habe ich es bisher nicht geschafft, den Speicher, den der Server benötigt, um die Clientverbindungen zu verwalten, wieder freizugeben.
Codebeispiel:
Server:
Code: Alles auswählen
InitNetwork()
CreateNetworkServer(0,2345,#PB_Network_TCP)
Repeat
Delay(1)
event = NetworkServerEvent()
cid = EventClient()
If cid
Debug "Verbindung von " + Str(cid)
EndIf
ForEver
Client:
Code: Alles auswählen
InitNetwork()
Repeat
Delay(1)
cid = OpenNetworkConnection("localhost",2345,#PB_Network_TCP)
If cid
CloseNetworkConnection(cid)
EndIf
ForEver
Leider geht der Arbeitsspeicherverbrauh des Servers immer mehr in die Höhe, obwohl der Client die Verbindung ja schließt. Wenn ich nach dem Disconnect des Clients versuche, die Clientverbindung durch den Server zu beenden, bekomme ich einen Invaild Memory Access (read error at address 0):
Code: Alles auswählen
InitNetwork()
CreateNetworkServer(0,2345,#PB_Network_TCP)
Repeat
Delay(1)
event = NetworkServerEvent()
cid = EventClient()
If NetworkServerEvent() = #PB_NetworkEvent_Disconnect
CloseNetworkConnection(cid) ; Error!
EndIf
ForEver
Weiß jemand, wie ich den Speicher freigeben kann, ohne dass PB einen Fehler meldet?
Danke im Voraus!
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 30.12.2009 19:55
von coder
CloseNetworkConnection() ist ein Client-seitiger Befehl, d.h. das er bei einem Server nix zu suchen hat. Außerdem du erhälst ja bereits das Event, das ein Client disconnected hat, warum willst du dann noch die Verbindung schließen? Sie ist doch bereits zu? Nach meinem Netzwerkverständnis wird auch nicht pro verbundenen Client speicher reserviert, sondern nur wenn etwas empfangen bzw. vllt. auch gesendet wird. Wobei das meistens auch noch von dir selbst gemacht werden soll (siehe ReceiveNetworkData() )
Klärt das vllt. dein Problem?
mfg
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 31.12.2009 04:17
von Terminal
coder hat geschrieben:Nach meinem Netzwerkverständnis wird auch nicht pro verbundenen Client speicher reserviert, sondern nur wenn etwas empfangen bzw. vllt. auch gesendet wird
Warum geht dann im obigen Codebeispiel der Arbeitsspeicherverbrauch des Servers hoch? Der Client öffnet nur die Verbindung per OpenNetworkConnection und schließt diese wieder.
coder hat geschrieben:CloseNetworkConnection() ist ein Client-seitiger Befehl, d.h. das er bei einem Server nix zu suchen hat
Irgendwie muss der Server die Verbindung zum Client doch auch schließen können, oder? Wenn ich beispielsweise im IRC o.Ä. jemanden vom Server kicke, muss der Server die Verbindung ja auch irgendwie beenden können, wenn der Client nach der Kicknachricht nicht disconnected.
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 31.12.2009 04:35
von Shadow-Gamer
coder hat geschrieben:CloseNetworkConnection() ist ein Client-seitiger Befehl
PB-Hilfe hat geschrieben:Wenn ein Server diese Funktion aufruft, wird die Verbindung ohne Hinweis an den Client geschlossen.
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 31.12.2009 12:56
von coder
@Shadow-Gamer:
Aha, gut zu Wissen

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 01.01.2010 16:03
von PureBasic4.0
Vielleicht wird der Speicher erst wieder nach einigen Minuten ohne Interaktion freigegeben? Hat PureBasic da evtl. irgendeine Automatik wie in Java den Garbage Collector?
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 01.01.2010 23:17
von HeX0R
Terminal hat geschrieben:
Weiß jemand, wie ich den Speicher freigeben kann, ohne dass PB einen Fehler meldet?
Danke im Voraus!
Den Fehler verursachst du selbst...
Bei jedem Aufruf von NetworkServerEvent() werden die Karten neu gemischt.
Also darfst du es nicht einfach nochmal aufrufen und davon ausgehen, dass die zuvor gespeicherte EventClient() auch zu diesem ServerEvent gehört.
Richtig wäre sowas in der Art (ungetestet):
Code: Alles auswählen
InitNetwork()
Procedure main()
OpenWindow(0, 0, 0, 300, 300, "Server", $C8001)
EditorGadget(0, 5, 5, 290, 280, #PB_Editor_ReadOnly)
If Not CreateNetworkServer(0, 2345, #PB_Network_TCP)
AddGadgetItem(0, -1, "Error, Port in use?")
End
EndIf
AddGadgetItem(0, -1, "Server running!")
Repeat
Select WaitWindowEvent(5)
Case #PB_Event_CloseWindow
Break
EndSelect
Select NetworkServerEvent()
Case #PB_NetworkEvent_Disconnect
CloseNetworkConnection(EventClient())
EndSelect
ForEver
CloseNetworkServer(0)
EndProcedure
main()
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 03.01.2010 01:51
von Terminal
Vielen Dank für den Code. Leider bekomme ich immernoch einen Invaild Memory Access, wenn ich folgenden Client nutze:
Code: Alles auswählen
InitNetwork()
Repeat
Delay(1)
cid = OpenNetworkConnection("127.0.0.1",2345)
If cid
CloseNetworkConnection(cid)
EndIf
ForEver
Auch nach dem Anpassen des Delays auf eine Sekunde o.Ä. gibt mir der Server einen IMA aus.
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 03.01.2010 11:56
von amiga123
Hi
Schau dir mal den Beitrag an.
http://forums.purebasic.com/german/view ... fd735fc01f
Damit wird dein Speicherproblem wahrscheinlich auch gelöst.
Gruß Amiga123
Re: Speicher wieder freigeben nach Netzwerk-Funktionen?
Verfasst: 05.01.2010 18:54
von Terminal
In deinem Beispiel werden aber Speicherbuffer verwendet. In meinem Code werden werden nicht einmal Daten hin- und hergeschickt, die du bei dir ja in einer Schleife mit ReceiveNetworkData ausliest.
Mein Code hier öffnet und schließt ja nur Verbindungen, dennoch geht der Arbeitsspeicherverbrauch hoch