Beim Server den ReceiveNetworkData Empfangspuffer leeren ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Beim Server den ReceiveNetworkData Empfangspuffer leeren ?

Beitrag von Bisonte »

Hallo erstmal.

Folgende Situation:

Client sendet ein Datenpaket, dessen erstes Long eine "Identifizierungszahl" ist.
Ich überprüfe nun beim Serverprogramm, ist das erste Long die richtige "Identifizierungszahl".

Wenn dem nicht so ist, dann möchte ich die Verbindung unterbrechen, allerdings müsste der
Empfangsbuffer des Servers ja noch den Rest der Daten die geschickt wurden enthalten...
wie löscht man diesen ?
Muss ich jetzt trotzdem alles per ReceiveNetworkData() einlesen, oder geht dies auch auf
anderem Weg.

Das soll verhindern, dass der Server mit irgendwelchen Daten zugemüllt wird, die gar nicht für ihn
bestimmt sind...
Oder verfolge ich da einen völlig falschen Ansatz ?

Und die nächste Frage würde dann lauten, wie kann ich vom Server aus die Verbindung unterbrechen ?,
oder müsste ich da mit dem Client kommunizieren so nach dem Motto "Unterbrich die Verbindung Client"...
was ja nicht registriert wird, wenn nicht der entsprechende Client benutzt wird...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von STARGÅTE »

Zum ersten Punkt:
Da ja schon die Daten vom Clienten im Eingangspuffer des Server liegen, wurde er schon "zugemüllt", das kann man meiner Meinung nach also nicht verhindern (unter PB-Bedingungen).
Das heißt, du kannst nur ein einer schnellen Schleife einfach ReceiveNetworkData() solange aufrufen bis alles leer ist.

Vielleicht hilft auch der zweite Punkte (folgt), das du einfach die Verbindung abbrichst, und dann PB selbst den Puffer leert.

Zum zweiten Punkt:
CloseNetworkConnection() hat geschrieben: Schließt die angegebene Client-'Verbindung'. Wenn ein Client diese Funktion aufruft, erhält der Server ein #PB_NetworkEvent_Disconnect Event. Wenn ein Server diese Funktion aufruft, wird die Verbindung ohne Hinweis an den Client geschlossen.
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
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von Bisonte »

Ah ok.

Und den zweiten Satz bei CloseNetworkConnection() hab ich doch glatt überlesen ;)

Danke.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
KatSeiko
Beiträge: 367
Registriert: 19.07.2008 07:47

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von KatSeiko »

Ich habe in meinen Programmen das Ganze so geregelt, dass mein Server ein Packet mit einer Datenstruktur erhält (Username, Passwort) und der Server erst mal mit "akzeptiert/zurückgewiesen" reagiert. Wenn der Server die Kombination zurückweist, bricht der Client erst mal die Verbindung ab.. Find ich etwas eleganter, weil so beide Seite ne Art Feedback haben. Der Client bricht die Verbindung ab, aber nicht ohne dass es der Server merkt..
Win7 Ultimate x64, PureBasic 5.11

There is no substitute..
BildBildBild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von Bisonte »

Es geht ja im Grunde darum, zu erkennen, ob die Daten auch von einem Client kommen, der "dazugehört".
Ich sende als erstes Long eine Kennung, und wenn diese übereinstimmt, lese ich mit dem Client die Datenmenge,
die ankommen wird aus.
Wenn der (von mir gemachte) Client benutzt wird ist alles in Ordnung. Wenn aber irgendein anderes Programm
benutzt wird (z.B. ein Browser oder was weiss ich) ist der 2. Wert ja alles mögliche, aber nicht die Grösse, was
dann evt. zu Problemen beim Server führen könnte (IMA oder fehlerhaftes Einlesen der Daten)
Ich versuch mir so, ein minimales Protokoll zu basteln, und klappt eigentlich ganz gut ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von PureLust »

Hi Bisonte,

da ein (in PB geschriebener) Client bei einem harten Schließen der Netzwerkverbindung Seitens des Servers keine Information darüber bekommt, ist so etwas natürlich nicht so ganz die sauberste Art.

Sollte der Client nicht von Dir sein, so kannst Du da natürlich nicht viel dran machen (da muss sich dann der Client selber drum kümmern so etwas sauber abzufangen).
Falls es sich bei dem Client aber um ein von Dir in PB geschriebenes Programm handelt, lohnt sich vielleicht ein Blick auf diesen Thread im englischen Forum.
Hier hat DarkPlayer eine CrossPlatform Lösung gepostet, der es dem Client ermöglicht ein Schließen der Netzwerkverbindung Seitens des Servers festzustellen, wodurch man dann entsprechend darauf entsprechend reagieren kann.

Greetz, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Beim Server den ReceiveNetworkData Empfangspuffer leeren

Beitrag von Bisonte »

Danke. Darkplayers Vorschlag hatte ich schon implementiert. ;)
Ich war mir halt nur nicht sicher, was mit dem Empfangsbuffer auf der Serverseite passiert,
wenn der Server die Daten nicht lesen soll, bzw. nicht der richtige Client antwortet...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten