Seite 1 von 1
NetworkClientEvent() - was geschieht intern?
Verfasst: 08.06.2012 11:20
von Toshy
Ich versuche ja nun mal etwas intensiver, aber nicht zu tief die Netzwerkaufrufe zu verstehen. PB-Funktionen und Verarbeitung und ein wenig die Socketgeschichte. Ich lese wir gerde einige Seiten im Web durch.
SendNetworkData() scheint nichts weiter als send() ohne Flagoption zu sein. oder gab es da nicht write().
Egal. Da mir nun ja die hohe Prozessorlast bei mehreren Verbindunge auf der Serverseite aufgefallen ist, interessieren mich halt die Funktionen NetworkServerEvent() und hier erst einmal NetworkClientEvent().
Da habe ich in der Api nichts zu gefunden. was ruft die Funktion auf?
Beim Server wundere ich mich gerade über die große Prozessorlast und durch das tutorial das ich gerade lese scheint es so, das irgendwie die sockets dort nicht blockiert sind und in einer schleife abgearbeitet werden. dabei gibt es wohl eine funktion die select() heißt und mit der man das wohl besser lösen kann.
da frage ich mich, ob man selecht() nicht auch auf "clientseite" verwenden kann, oder etwas ähnliches.
also nicht in einer schleife jede verbindung abfragen, sondern eine funktion aufrufen die mir eine liste mit den sockets zurück gibt.
Weiß jemand wie NetworkClientEvent() macht?
Toshy
Re: NetworkClientEvent() - was geschieht intern?
Verfasst: 09.06.2012 20:33
von Dark
Hi,
außer Fred kann wahrscheinlich keiner sagen wie die Network Lib intern funktioniert. Er wird aber mit hoher Wahrscheinlichkeit den select() Befehl verwenden, da dieser unter allen drei Betriebssystemen zur Verfügung steht. Dieser besitzt ein Timeout, welcher bestimmt, wie lange dieser auf ein Event wartet. In PB ist NetworkServerEvent() nicht blockierend und daher mit 99,99% Wahrscheinlichkeit auch der Timeout = 0.
Wenn ich deine Beiträge lese, habe ich das Gefühl, dass du denkst, dass ein blockierender Prozess eine hohe Auslastung verursacht, aber dies ist genau verkehrt. Ein Prozess der blockiert ist, wird so lange pausiert bis die benötigten Daten zur Verfügung stehen. Er verbraucht also gar keine CPU Auslastung. Bei einer reinen Netzwerkanwendung, die nichts anderes macht als Anfragen abzuarbeiten, wie z.B. ein Webserver, wäre also eine blockierende Variante mehr CPU schonend. Da der select Befehl aber nur eine bestimmte Anzahl von Sockets gleichzeitig abfragen kann (unter Windows kann man die Anzahl beliebig erhöhen), muss man bei Servern meistens mehrere select Befehle hintereinander ausführen, die nicht blockierend sein dürfen. Viele Server erstellen pro Verbindung einen eigenen Thread, weshalb dann jeder Thread nur noch ein Socket abfragen müsste. Der Hauptthread frägt dann dann nur das Socket ab, welches auf neue Verbindungen wartet, und akzeptiert diese.
PureBasic verwendet blockierende Sockets, was man sehr gut an ReceiveNetworkData() sieht. Häufig wird dies als Bug angesehen (wenn man vorher nicht auf Events testet), es ist jedoch eher ein Feature. Es erlaubt einem den Prozess so lange zu pausieren bis auf dem Socket Daten verfügbar sind oder ein Fehler auftritt.
Durch die eingebaut ID Verwaltung ist die PB Networklib tatsächlich nicht unbedingt die effizienteste Variante, sollte aber für die meisten Anwendungsfälle ausreichen. Sonst muss man sich selbst seine Netzwerkbefehle schreiben, was nicht all zu schwer ist.
Dark
Re: NetworkClientEvent() - was geschieht intern?
Verfasst: 10.06.2012 02:44
von Toshy
Dann haben wir uns mißverstanden. Mir ist schon klar, das ein Blockierter Socket den Prozessor schon.
Aber genau das "scheint" die Serverseite nicht zu machen. Das der der Server nicht blockiert ist habe ich dank euch und einem Beitrag von Fred gelesen. Nur ob er ein Timeout von NULL nimmt oder wie es der Last nach aus sieht eher gar kein Select() sondern alle Sockets in einer Schleife ohne Delay() abfragt weiß ich nicht. Da die Clientseite aber blockiert ist (entgegen der Hilfedatei), habe ich mich halt gefragt, wie das da läuft.
Select() oder ob es da eine andere Funkton gibt weiß ich halt nicht. Ich tue mich halt recht schwer mit den vielen englischen Beschreibungen. Und C-Code habe ich auch nicht gelernt. Aber so so einiges verstanden.
Die Serverseite kann ich ja leider nicht beeinflußen (bis wir nicht mal einen Servercode erstellen), aber ich hatte mir halt überlegt zu schauen, ob ich anstatt NetworkServerEvent() eine eigene auf dem Socket beruhende Abfrage schreibe.
Nicht sofort, aber so bald ich meine auf der Networklib bestehenden Routinen endlich mal fertig habe, werde ich das nach und nach versuchen. Dafür vorbereitet ist mein Code schon. Umstallen brauche ich dann vermutlich nicht viel.
Danke erstmal.