Server - Client Kommunikation

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Server - Client Kommunikation

Beitrag von Bisonte »

Ich versuche mich gerade an einem Server-Client Programm...

Ein Client soll sich mit dem Server verbinden.

1. Der Client sendet also ein Login String und wartet auf Antwort.
2. Der Server empfängt den Login String und verarbeitet die Daten.
3. Der Server schickt eine Antwort.
4. Der Client empfängt die Antwort.

Dazu hab ich Fragen ...

Gibt es da zwischen Punkt 1 und Punkt 4 einen Timeout ?
Oder kann sich der Server alle Zeit der Welt leisten bis er die Anwort schickt ?

Wenn mehrere Clients sich verbinden, liegen nun mehrere Logindaten vor.
Existiert soetwas wie ein Queue bei dem ServerEvent und/oder RecieveNetwork, damit ich alles schön der Reihe nach abarbeiten kann ?
Oder muesste ich jetzt den Client solange den Login String senden lassen,
bis der Server endlich die passende Antwort geschickt hat ?

Und dann noch : Wenn der Client eine Weile keine Daten Sendet oder empfängt, schliesst sich die Verbindung irgendwann automatisch, oder
ist die Verbindung erst mit dem CloseNetwork geschlossen ?
(Ich habe das bei MySQL DB's bemerkt, das man da öfters prüfen muss, da der Server einen nach einer Weile die Verbindung kappt, wenn keine Aktionen durchgeführt wurden.)
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
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Zwischen Punkt 1 und 4 sollte es nur einen Timeout geben, wenn du diesen selber programmierst. Ob sich die Verbindung automatisch schließt, kann ich nicht genau sagen. Ich denke es wird ein Timeout geben, dieses wird aber wahrscheinlich großzügig sein.
Ich handhabe es so, alle paar Sekunden einen Ping zu schicken und somit die Kontakte des Servers aktuell zu halten. Soll zB jede Sekunde ein Ping geschickt werden, und es kommt 10 Sekunden keine Antwort, gibts einen von mir erstellten Timeout.

Du arbeitest ja alle Networkevents ab. Diese sind nach den ClientIDs sortiert. Sprich:
-Prüfen ob ein Event auftritt
-Client feststellen
-Event auswerten (ReceiveNetworkData)

Sollten 5 Clients gleichzeitig etwas schicken, wird halt 5 mal ein Networkevent ausgelöst.

Jede Nachricht braucht (bei TCP) nur einmal gesendet werden. Der Server wirds nach belieben auswerten können.

Am einfachsten (finde ich) ist es, eine LinkedList zB mit der Struktur:
ClientID
Text
Zeitpunkt

zu erstellen und einfach beim Empfangen per Addelement() dieses hinzu zufügen. Irgendwo arbeitest du diese Liste dann ab.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Dank erstmal... gleich ausprobieren ;)
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
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Es gibt keinen Timeout, ganz im gegenteil. Wenn der Server
CloseNetworkConnection() aufruft, wird dem entsprechenden Client keine
Nachricht geschickt. Dieser kann also immer noch munter weiter Daten
schicken, er wird nur keine Antwort mehr bekommen.

Macht der Client das allerdings, wird der Server benachrichtigt.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Also ganz brav vor dem CloseNetworkConnection() an jeden Client ein Logoff schicken...

Sowas hab ich mir dann fast gedacht...

Na dann bin ich mal auf den Stresstest gefasst ;)
Ohne Threads mit ca. 50 Clients gleichzeitig...

Mal sehen ob das funktioniert, es geht bei der Kommunikation auch nur um bytehappen... soll dem Anticheating dienen ähnlich wie Punkbuster.
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
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Sollte kein Problem sein. Ich empfehle dir aber, die Netzwerksachen in einen Thread auszulagern, damit das Senden und Empfangen von vielen Daten nicht so sehr auf die Hauptschleife drückt.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Naja ich scheue mich ein wenig davor... weil ich damit noch nie wirklich was gemacht habe...
und wenn ich mir die ganzen Threads im Forum hier anschaue, scheint das eine ganz bösartige schwierige Sache zu sein: diese Threadprogrammierung.

Ausserdem hab ich eine menge LinkLists da drin, daher hab ich ein kleinen Bammel davor, dass mir das alles unerwartet durcheinanderwirbelt... das wäre uncool... ;)
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