Networkfunktionen>PB/Systeminterner Ablauf vom (Dis-)Connect
Verfasst: 12.05.2012 08:14
Hi,
Im Nachgang zu
http://www.purebasic.fr/german/viewtopi ... 36#p301536
habe ich nun noch ein Anliegen.
Ich erstelle meinen code ja komplett neu und wie vorher nutze ich auch Threads. Da muß man natürlich ein wenig aufpassen.
Bisher sollte meine Struktur noch hinhauen, aber manchmal raucht mein Kopf schon um da in der Codestruktur keine Timingfehler zu bekommen.
Jetzt ist mir aber etwas eingefallen, was ich so noch nicht bedacht hatte.
Das Systemhandle einer Netzwerkverbindung (Socket) bekommt man ja mit PB raus, PB selbst nutzt eine eigene IDverwaltung.
Dann muß man auch noch selbst eine Erstellen.
Ein vermutetes Problem, das vielleicht nicht sicher lösbar ist, findet sich hier:
*Es existiert eine Netzwerkverbindung innerhalb eines Programmes (im grunde egal ob Server, oder Client, sagen wir mal Server). und ich habe die "PurebasicConnectionID".(damit bekomme ich natürlich auch das Systemhandle)
* Nun sendet ein extra Thread Daten über das netzwerk.
* die Netzwerkverbindung wird "von außern" getrennt.
* Programm erhalt ein Event (als Server)
nun ist das Systemhandle und die PurebasicId vermutlich "ungültig" und darf nicht mehr benutzt werden. PB und das System kann die HAndles sicher gleich wieder vergeben.
Was aber ist, wenn dieses Handle sofort wieder vergeben wird, weil halt eine neue Verbindung aufgebaut wird.
Da das Programm kann für einige Zeit ja noch nciht sicher wissen, das die Verbindung beendet ist.
Sagen wir mal, ich würde jetzt was zwar ein Threadausbremser wäre, nach JEDEM Disconnect sofort alle Thread anhalten (vor JEDEM sendnetworkdata alles Thread erst mal prüfen ob ein Event eingegangen ist und so lange warten, bis klar ist, es ist nicht die ID die gerade genutzt wird). So bliebe doch ein Problem, denn selbst zwischen dem
NetworkServerEvent()
des Hauptprocesses und dem setzes sagen wir mal eines Flags, Mutex oder sonst etwas und dem auslesen im SendeThread kann ja schon eine neue Verbindung mit den selben Handles aufgebaut sein.
Das ist jetzt noch nicht ganz genau ausgeführt. Grundlegend erklärt es aber schon worum es geht.
Die Frage die sich stelltist, wie lauft das mit der Vergabe und dem "löschen" der Handles genau ab?
Wenn nach dem "NetworkServerEvent()" das PBHandle (und das systemhandle) ungültig bleiben bis ich das nächste mal NetworkServerEvent() auslese, also weitere Versuche dort etwas zu senden fehl schlagen, selbst wenn neue Verbindungen aufgebaut werden, dann gäbe es kein Problem.
Dazu müßte PB alle Zugriffe auf diese Connection nur so abweisen, als ob sie nicht besteht, bis ich das Connect ausgelesen habe.
Leider habe ich dazu noch keine Informationen gefunden.
Was macht PB als "intern".
Gruß
Toshy
Im Nachgang zu
http://www.purebasic.fr/german/viewtopi ... 36#p301536
habe ich nun noch ein Anliegen.
Ich erstelle meinen code ja komplett neu und wie vorher nutze ich auch Threads. Da muß man natürlich ein wenig aufpassen.
Bisher sollte meine Struktur noch hinhauen, aber manchmal raucht mein Kopf schon um da in der Codestruktur keine Timingfehler zu bekommen.
Jetzt ist mir aber etwas eingefallen, was ich so noch nicht bedacht hatte.
Das Systemhandle einer Netzwerkverbindung (Socket) bekommt man ja mit PB raus, PB selbst nutzt eine eigene IDverwaltung.
Dann muß man auch noch selbst eine Erstellen.
Ein vermutetes Problem, das vielleicht nicht sicher lösbar ist, findet sich hier:
*Es existiert eine Netzwerkverbindung innerhalb eines Programmes (im grunde egal ob Server, oder Client, sagen wir mal Server). und ich habe die "PurebasicConnectionID".(damit bekomme ich natürlich auch das Systemhandle)
* Nun sendet ein extra Thread Daten über das netzwerk.
* die Netzwerkverbindung wird "von außern" getrennt.
* Programm erhalt ein Event (als Server)
nun ist das Systemhandle und die PurebasicId vermutlich "ungültig" und darf nicht mehr benutzt werden. PB und das System kann die HAndles sicher gleich wieder vergeben.
Was aber ist, wenn dieses Handle sofort wieder vergeben wird, weil halt eine neue Verbindung aufgebaut wird.
Da das Programm kann für einige Zeit ja noch nciht sicher wissen, das die Verbindung beendet ist.
Sagen wir mal, ich würde jetzt was zwar ein Threadausbremser wäre, nach JEDEM Disconnect sofort alle Thread anhalten (vor JEDEM sendnetworkdata alles Thread erst mal prüfen ob ein Event eingegangen ist und so lange warten, bis klar ist, es ist nicht die ID die gerade genutzt wird). So bliebe doch ein Problem, denn selbst zwischen dem
NetworkServerEvent()
des Hauptprocesses und dem setzes sagen wir mal eines Flags, Mutex oder sonst etwas und dem auslesen im SendeThread kann ja schon eine neue Verbindung mit den selben Handles aufgebaut sein.
Das ist jetzt noch nicht ganz genau ausgeführt. Grundlegend erklärt es aber schon worum es geht.
Die Frage die sich stelltist, wie lauft das mit der Vergabe und dem "löschen" der Handles genau ab?
Wenn nach dem "NetworkServerEvent()" das PBHandle (und das systemhandle) ungültig bleiben bis ich das nächste mal NetworkServerEvent() auslese, also weitere Versuche dort etwas zu senden fehl schlagen, selbst wenn neue Verbindungen aufgebaut werden, dann gäbe es kein Problem.
Dazu müßte PB alle Zugriffe auf diese Connection nur so abweisen, als ob sie nicht besteht, bis ich das Connect ausgelesen habe.
Leider habe ich dazu noch keine Informationen gefunden.
Was macht PB als "intern".
Gruß
Toshy