Speicher wieder freigeben nach Netzwerk-Funktionen?

Anfängerfragen zum Programmieren mit PureBasic.
Terminal
Beiträge: 6
Registriert: 29.12.2009 12:11

Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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!
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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
Windows 7 x64 | PureBasic 4.60 4.50 4.02
Ja verdammt, meine Eltern wohnen immer noch bei mir!
Terminal
Beiträge: 6
Registriert: 29.12.2009 12:11

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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.
Benutzeravatar
Shadow-Gamer
Beiträge: 152
Registriert: 06.09.2009 13:31
Computerausstattung: NB: Intel P8700, Mobility ATI HD4650, 4GB, Win 7

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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.
Ich versuche ja nicht faul zu sein. :)
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag von coder »

@Shadow-Gamer:
Aha, gut zu Wissen :o
Windows 7 x64 | PureBasic 4.60 4.50 4.02
Ja verdammt, meine Eltern wohnen immer noch bei mir!
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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?
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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()
Terminal
Beiträge: 6
Registriert: 29.12.2009 12:11

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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.
amiga123
Beiträge: 88
Registriert: 17.02.2009 18:05

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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
Pure Basic 4.60 Vollversion
http://www.Sundisp.de
Terminal
Beiträge: 6
Registriert: 29.12.2009 12:11

Re: Speicher wieder freigeben nach Netzwerk-Funktionen?

Beitrag 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
Antworten