Hallo Leute.
Für die richtige Erstellung (keine Überflüssigen Abfragen) des Codes beim Empfang der Daten habe ich folgendes Anliegen:
Mit "NetworkServerEvent()" erfahre ich ob Daten eingegangen sind. Mit "EventClient()" an wer gesendet hat (ConnectionID).
Mit "ReceiveNetworkData()" kann ich nun Daten empfangen. Kein Problem.
Nun frage ich aber Daten ab und bekomme als Ergebnis auch raus, ob noch Daten vorhanden sind. Gehen wir mal davon aus, das noch Daten vorhanden sind. Nun frage ich weiterhin ab, ob Daten vorhanden sind. Vom Prinzip her egal, ob Byteweise, zwei Bytes oder 1000 ausgelesen werden.Dies geschieht möglichst in Form einer Schleife.
Was ist aber, wenn in der Zeit des Auslesens neue Daten eintreffen. Sind die dann genau in dem Buffer, so das ich sie weiter auslesen kann, oder werden die in einen neuen internen Speicher gelegt, auf den ich erst nach dem auslesen des alten automatisch zugriff erhalte. Schließlich gibt es ja auch neue Serverevents.
Weiterhin ist auch interessant, wann "NetworkServerEvent" ein Event liefert? Beim Eingang bestimmter Datenmengen innerhalb eines Zeitraums, oder dauerhaft, solange Daten im Speicher sind?
Einerseit möchte ich das wissen, um den Hintergrund etwas zu verstehen und zweitens, damit bei größeren Datenmengen (gerade bei langsamer Verbindung) ich nicht mit einer falschen Codestruktur dafür Sorge, das nur die Daten einer Verbindung ausgelesen werden bis der Buffer leer ist und dann erst die anderen abgearbeitet werden.
Egal wie es intern abläuft, ist ja kein Problem diese ein oder zwei Zeilen Code anzupassen, aber dazu müßte ich halt wissen wie es läuft.
Durch reines Probieren kann man sich da ja leider nicht sicher sein.
Danke Toshy
Networkfunktionen>PB/Systeminterner Ablauf vom Datenempfang?
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Networkfunktionen>PB/Systeminterner Ablauf vom Datenempfang?
1. Win10
PB6.1
PB6.1
Re: Networkfunktionen>PB/Systeminterner Ablauf vom Datenempf
Die Daten für treffen alle in einem Internen Buffer ein, der wnen er voll ist, keinen weiteren aufnehmen kann (Zahl weiß ich nicht).Toshy hat geschrieben:Was ist aber, wenn in der Zeit des Auslesens neue Daten eintreffen. Sind die dann genau in dem Buffer, so das ich sie weiter auslesen kann, oder werden die in einen neuen internen Speicher gelegt, auf den ich erst nach dem auslesen des alten automatisch zugriff erhalte. Schließlich gibt es ja auch neue Serverevents.
Beim Ausführen von ReceiveNetworkData() wird exakt die angegebene Länge aus dem Internen Buffer gelesen, in deinen angegebenen Buffer geschrieben und dann im internen Buffer freigegeben (sodass platz für neue Daten ist).
Das heißt, auch bei langsammen Verbindungen kannst du in einer Schleife alle nötigen Daten empfangen, du musst halt nur deinen Eigenen Buffer anpassen:
Pseudocode:
Code: Alles auswählen
Repeat
Length = ReceiveNetworkData(Connection, *Buffer+Offset, 1000)
Offset + Length
NetworkServerEvent() gibt inner dann das Event "Data" zurück, wenn Daten im Buffer sind.Toshy hat geschrieben:Weiterhin ist auch interessant, wann "NetworkServerEvent" ein Event liefert? Beim Eingang bestimmter Datenmengen innerhalb eines Zeitraums, oder dauerhaft, solange Daten im Speicher sind?
Wenn du also nichts lesen würdest, würe das Event immer wieder kommen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Re: Networkfunktionen>PB/Systeminterner Ablauf vom Datenempf
Das ist gut zu Wissen, damit wäre ein Problem für mich erledigt. Es macht mir die Sache einfacher.STARGÅTE hat geschrieben:NetworkServerEvent() gibt inner dann das Event "Data" zurück, wenn Daten im Buffer sind.Toshy hat geschrieben:Weiterhin ist auch interessant, wann "NetworkServerEvent" ein Event liefert? Beim Eingang bestimmter Datenmengen innerhalb eines Zeitraums, oder dauerhaft, solange Daten im Speicher sind?
Wenn du also nichts lesen würdest, würe das Event immer wieder kommen.
Bei dem andren Anliegen hast du mich mißverstanden.
Der Teil ist mir bewußt.
Ich meinte... (als Beispiel... in der Praxis kommen natürlich sinnvollere Werte)
* Puffer zum Auslesen 10 Bytes groß (je 10 Bytes pro Aufruf ausgelesen)
1. Client sendet 1000 Bytes
2. Event wird erfaßt
3. server liest 100 bytes aus
4. server liest noch mal 100 bytes aus
5. client sendet noch mal 1000 bytes
6 server liest noch mal 100 bytes aus
....
so, ursprünglich waren 1000 bytes in dem bereich zum auslesen. erst wurden insgesasmt 200, dann 300 ausgelesen. als im puffer noch 800 bytes waren, kam nun 1000 auf dem rechner an.
nun ist aber die frage. sind bei der abfrage nun 800 oder 1800 vorhanden.
interessant ist dabei nicht, ob ich jetzt in einer schleife je 100 byte auslese, bis 1800 abgebaut sind... das ist klar.
sonst was zum zweipunkt (bei punkt 5) an dem der rechner 1800 bytes empfangen hat ein "receivenetworkdate" mit einem auslesebuffer von 1800 (anstatt 100) nun die 1800 ausliest (selbe buffer), oder nur 800 und dann erst nach abfrage des events wieder der rest ausgelesen werden kann.
zwar schreibt wohl jede verbindung (socket oder das genannt wird) in den selben speicher, aber ich weiß ja nicht, wie pb das intern verarbeitet.
Ich selbst zum beispiel lese die daten ja auch aus. aber ich verarbeite sie nicht direkt, sondern je verbindung erstelle ich einen eigenen puffer um daten zu sammen (bis sie eine sinnvolle Anweisung oder einen vollständigen datenblock ergeben). da pb ja auch eigene interne "handles" / "ID"'s nutzt, würde ich das gerne genauer wissen.
wenn es wirklich so ist, das immer ein event ausgelöst wird, so lange irgendwo daten vorhanden sind, dann ist ja gut. dann braucht man gar nicht in einer schleife kommplett alle daten auszulesen, dann kann das über die hauptschleife ablaufen. denn durch das event wird ja wieder in die ausleseprocedure gesprungen.
Hintergrund des anliegens ist vor allem, das nicht eine verbindung die gerade dauerhaft viele daten erhält, andere "blockiert". ich will alle verbindungen gleichmäßig abarbeiten.
Allerdings bin ich da noch am überlegen.
denn es hängt ja auch davon ab, ob es nur einen einzigen "globalen" puffer gibt, einen je (lauschenden) port oder je einen pro Verbindung (connection).
Wenn das wer weiß,... wäre auch nett.
mein Problem ist leider, das die meißten Infos welche die "Windowsfunktionen" usw. beschreiben auf englisch sind... und da muß ich sehr viel interpretieren... extrem schlechte Sparachkenntnisse.
Und unabhängig davon.... kann pb ja intern alles auf eine andere WEise machen.
Es geht mir einfach darum den Hintergrund zu verstehen und einfach "Strukturfehler" im Code zu verhindern.
Danke.
1. Win10
PB6.1
PB6.1
Re: Networkfunktionen>PB/Systeminterner Ablauf vom Datenempf
Das erste ist richtig. Wenn zusammen 1800 im Buffer liegen, dann "reicht" ein Event vom Server, bzw wird dieses Ankommen der zwei mal 1000 Bytes nur als 1 Event gezählt, und du kannst komplett alle restlichen 1800 Bytes lesen.Toshy hat geschrieben:[...]sonst was zum zweipunkt (bei punkt 5) an dem der rechner 1800 bytes empfangen hat ein "receivenetworkdate" mit einem auslesebuffer von 1800 (anstatt 100) nun die 1800 ausliest (selbe buffer), oder nur 800 und dann erst nach abfrage des events wieder der rest ausgelesen werden kann.
zwar schreibt wohl jede verbindung (socket oder das genannt wird) in den selben speicher, aber ich weiß ja nicht, wie pb das intern verarbeitet.
Das macht es im übrigen so schwer, die Pakete die der Client einzeln sendet beim Server wieder zu trennen. Ein eigenes Paketsystem (also das mitsenden der Länge) ist somit "pflicht".
Du kannst dir das PB wirklich so vorstellen:
Der Buffer ist ein Eimer, und ankommende Daten werden oben reingefüllt.
NetworkServerEvent gibt genau dass Data-Event zurück, wenn der Eimer mindestens 1 Byte enthält.
Mit einem Ventil kann dann unten am Eimer der Buffer gelesen werden.
(bitte dieses Bild nicht falschverstehen)
Richtig das kannst du machen.Toshy hat geschrieben:wenn es wirklich so ist, das immer ein event ausgelöst wird, so lange irgendwo daten vorhanden sind, dann ist ja gut. dann braucht man gar nicht in einer schleife kommplett alle daten auszulesen, dann kann das über die hauptschleife ablaufen. denn durch das event wird ja wieder in die ausleseprocedure gesprungen.
Und es hat jeder Client seinen eigenen Buffer.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Re: Networkfunktionen>PB/Systeminterner Ablauf vom Datenempf
Ich danke herzlich.
Das hat alles aufgeklärt.
Ich habe es mir im Grunde auch so vorgestellt, nur wußte ich es halt nicht. Und dann ist das mit der Codestruktur an dieser Stelle erheblich einfacher.
Danke Danke Danke
Toshy
Das hat alles aufgeklärt.
Ich habe es mir im Grunde auch so vorgestellt, nur wußte ich es halt nicht. Und dann ist das mit der Codestruktur an dieser Stelle erheblich einfacher.
Danke Danke Danke
Toshy
1. Win10
PB6.1
PB6.1
-
Toshy
- Beiträge: 713
- Registriert: 22.03.2005 00:29
- Computerausstattung: Computer und Strom vorhanden
- Wohnort: LK Wolfenbüttel
Re: Networkfunktionen>PB/Systeminterner Ablauf vom Datenempf
Ich hätte noch mal eine Nachfrage.
Was geschieht mit den Daten im Netzwerkpuffer einer Verbindung, wenn diese beendet wird (Server und Client)? Vor allem erst einmal am Server?
Also wenn über eine bestehende Verbindung Daten einkommen, die noch nicht ausgelesen sind und dan die Verbindung beendet wird?
1. was geschieht in dem Moment? Ist der Datenpuffer mit den Restdaten dann weg? Oder erst wenn die Daten komplett ausgelesen sind? Oder eventuell wenn das Disconnect Event ausgelesen wurde?
[Ich verarbeite Dateneingang nicht zwangsläufig sofort (zeitlich wohl zwar nur Millisekunden, aber in der Struktur werden zwangsläufig nicht sofort alle Daten ausgelesen). Disconnects aber werden natürlich auch ausgelesen, damit diese gleich verarbeitet werden können. Ich will ja nicht auf einer geschlossenen Verbindung versehentlich senden.]
2. Ab wann kann eine connectionID von Purebasic wieder verwendet werden? gleich nach dem disconnect oder falls (siehe 1.) der Datenpuffer doch noch vorhanden und gefüllt ist, erst nach dem Disconnect & auslesen aller Pufferdaten?
[ich muß die ConnectionID ja in einer Liste oder ähnlichem zwischenspeichern. Nun wird die Verbindung beendet und aus der Liste entfernt. Aber wenn sie sofort wieder verwendet wird, muß ich bei mehreren Threads doch etwas anders vorgehen. Die ConnectionID ist ja nicht das Systemhandle / Socket. Daher wäre es interessant wie das in PB gehandhabt wird]
3. gibt es eine Unterschiedliche handhabung dieser Dinge zwischen Purebasic und den Systemfunktionen? Zwar nutzt PB die Systemfunktionen, aber die ConnectionID ist ein eigenes Handle bzw. wohl Pointer auf eine PBinterne Struktur.
Toshy
Was geschieht mit den Daten im Netzwerkpuffer einer Verbindung, wenn diese beendet wird (Server und Client)? Vor allem erst einmal am Server?
Also wenn über eine bestehende Verbindung Daten einkommen, die noch nicht ausgelesen sind und dan die Verbindung beendet wird?
1. was geschieht in dem Moment? Ist der Datenpuffer mit den Restdaten dann weg? Oder erst wenn die Daten komplett ausgelesen sind? Oder eventuell wenn das Disconnect Event ausgelesen wurde?
[Ich verarbeite Dateneingang nicht zwangsläufig sofort (zeitlich wohl zwar nur Millisekunden, aber in der Struktur werden zwangsläufig nicht sofort alle Daten ausgelesen). Disconnects aber werden natürlich auch ausgelesen, damit diese gleich verarbeitet werden können. Ich will ja nicht auf einer geschlossenen Verbindung versehentlich senden.]
2. Ab wann kann eine connectionID von Purebasic wieder verwendet werden? gleich nach dem disconnect oder falls (siehe 1.) der Datenpuffer doch noch vorhanden und gefüllt ist, erst nach dem Disconnect & auslesen aller Pufferdaten?
[ich muß die ConnectionID ja in einer Liste oder ähnlichem zwischenspeichern. Nun wird die Verbindung beendet und aus der Liste entfernt. Aber wenn sie sofort wieder verwendet wird, muß ich bei mehreren Threads doch etwas anders vorgehen. Die ConnectionID ist ja nicht das Systemhandle / Socket. Daher wäre es interessant wie das in PB gehandhabt wird]
3. gibt es eine Unterschiedliche handhabung dieser Dinge zwischen Purebasic und den Systemfunktionen? Zwar nutzt PB die Systemfunktionen, aber die ConnectionID ist ein eigenes Handle bzw. wohl Pointer auf eine PBinterne Struktur.
Toshy
1. Win10
PB6.1
PB6.1