 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 03.01.2011, 12:45 Titel: Online Kartenspiel |
|
|
Hallo liebe Leute,
ich möchte gerne ein Online Kartenspiel programmieren.
Damit meine ich, dass sich 4-7 Spieler (Freunde) wo auch immer einloggen können und dann miteinander das Kartenspiel spielen können.
Das Programm selbst soll nicht intelligent sein, d.h. es soll keinen Spieler ersetzen. Es soll lediglich allen Spielern mitteilen können, wer gerade welche Karte ausgespielt hat.
In einem Heimnetzwerk stelle ich mir das recht simpel vor, da alle auf eine Datei in einem freigegebenem Ordner zugreifen könnten. Aber bei online muss ich total passen.
Ich habe schon einige Netzwerkbeiträge hier gelesen, aber die habe ich leider überhaupt nicht begriffen.
Kann mir jemand mal einen Ansatz geben, wie und womit ich anfangen könnte?
Vielen Dank im Vorraus.
Fred |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 03.01.2011, 13:15 Titel: |
|
|
Meine berühmter Artikel zum Thema:
http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/InternetMitQuickBASIC.html
Wichtigster Unterschied in FreeBasic: direktes Ansprechen der WINSOCK.DLL möglich bzw. es gibt sogar plattformneutrale Bibliotheken.
Konzeptionell würde ich in Deinem Fall mit Sockets arbeiten, das Ganze als Client- und Serverapplikation. Dabei gibt es die Varianten Heimnetz (=der FreeBasic-Prozess des einen Spielers ist der Server) und die Variante Zentralserver (=dedizierter Server, der bei Microsoft als Dienst läuft bzw. bei Linux als Daemon). Diesen könntest Du im Prinzip auf einem gemieteten Rootserver (heute dank Virtualisierung als sog. vServer sehr preiswert!) hosten.
An Deiner Stelle würde ich das Ganze vielleicht wie folgt ansetzen:
Schritt 1: Heimnetzvariante. -> Dann brauchst Du Dich nur um gerade ein laufendes Spiel kümmern
Schritt 2 (spätere Phase): Server separat. -> Hier kämen dann Dinge wie Registrierung als Benutzer / Gast usw. ins Spiel. Natürlich auch hier die Zwischenetappe "interner Server" denkbar, d.h. bereits separater Prozess. evtl. sogar als Dienst, der aber noch nicht das ganze Benutzermanagement besitzt und sich deswegen nur primär im LAN hinter dem NAT-Router eignet. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 03.01.2011, 13:41 Titel: |
|
|
Hallo und willkommen im Forum!
In dem Fall muss einerseits eine Lösung gefunden werden, Teilnehmer zu Spielrunden zuzulassen, andererseits muss dafür gesorgt werden, dass der Spielstand eines laufenden Spiels stets an alle Teilnehmer übermittelt werden kann. Es muss also für den einzelnen Teilnehmer die Möglichkeit geben, seine "Spielzüge" an die anderen zu vermelden.
Das passiert im Internet nicht über Windows-Netzwerkfreigaben (SMB/CIFS), sondern andere Protokolle der Anwendungsschicht (bspw. möglich wäre HTTP in der Ausprägung eines Webservices).
Idealerweise würde man bei einem Online-Multiplayer-Spiel einen zentralen Host im Internet einrichten, gegenüber dem sich die Teilnehmer zunächst authentifizieren und zu Spielrunden anmelden.
Anschließend würde immer der Host (Server) die aktuellen Spielinformationen an alle verbundenen Teilnehmer (Clients) übermitteln.
Die Clients melden dann ihrerseits dem Host ihre Spielaktionen/-züge zurück. Der Host passt den Spielstand, über den er "Buch führt", dann entsprechend an (Veränderung z. B.: "neue Karte liegt auf dem Tisch") und sendet die "Neuigkeit" an alle verbundenen Teilnehmer.
Hierbei handelt es sich um einen zentralistischen Ansatz, der viele Vorteile hat, aber die Einrichtung eines zentralen Servers voraussetzt.
Das kann einerseits ein "richtiger", angemieteter Server im Internet (Rootserver/vServer) sein oder aber ein Heimserver/Heim-PC, der über einen Dienst wie DynDNS zugänglich gemacht wird.
Neben dem zentralistischen Ansatz, dem ich den Vorzug einräumen würde, gäbe es die Möglichkeit, ein solches Spiel als Peer-to-Peer-System zu gestalten. Jeder Teilnehmer würde sich direkt mit allen anderen Teilnehmern verbinden und so Spielrunden abwickeln. Vor Beginn eines Spiels müsste jeder Spieler die IP-Adressen (oder DynDNS-Domainnamen) aller anderen Spieler kennen und im Spiel angeben.
Möglich wären aber auch "Hybrid-Ansätze". Es wäre denkbar, dass eine einfache php-basierte Seite auf einem Webserver den Login abwickelt und die IP-Adressen der eingeloggten Teilnehmer zentral speichert. Auf dieses zentrale Teilnehmer-Register könnten dann die Clients zugreifen, um ein Spiel anzubahnen, aber dennoch im Spielverlauf peer-to-peer kommunizieren.
Ehe man anfängt, etwas zu programmieren, muss man also erst einmal eine Herangehensweise auswählen und darauf aufbauend ein Detailkonzept (z. B. unter Einschluss eines eigenen Protokolls) entwickeln. Davon hängt nämlich ab, welche Software/Bibliotheken geeignet sind.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 03.01.2011, 19:22 Titel: |
|
|
Vielen Dank für die Denkanstöße.
Zitat: |
Idealerweise würde man bei einem Online-Multiplayer-Spiel einen zentralen Host im Internet einrichten, gegenüber dem sich die Teilnehmer zunächst authentifizieren und zu Spielrunden anmelden.
Anschließend würde immer der Host (Server) die aktuellen Spielinformationen an alle verbundenen Teilnehmer (Clients) übermitteln.
Die Clients melden dann ihrerseits dem Host ihre Spielaktionen/-züge zurück. Der Host passt den Spielstand, über den er "Buch führt", dann entsprechend an (Veränderung z. B.: "neue Karte liegt auf dem Tisch") und sendet die "Neuigkeit" an alle verbundenen Teilnehmer.
Hierbei handelt es sich um einen zentralistischen Ansatz, der viele Vorteile hat, aber die Einrichtung eines zentralen Servers voraussetzt.
Das kann einerseits ein "richtiger", angemieteter Server im Internet (Rootserver/vServer) sein oder aber ein Heimserver/Heim-PC, der über einen Dienst wie DynDNS zugänglich gemacht wird.
|
Ich denke, genau so werde ich es machen. Die Frage ist jetzt, wie gehe ich weiter vor?
Ich habe mir mal die TSNE_V3.bi angesehen - und verstehe nur Bahnhof.
Gibt es irgendwo leicht verständlichen Beispiel-Code?
Die Betonung liegt hierbei auf leicht verständlich.
Was ich mir noch überlegt habe, wäre das über ftp laufen zu lassen.
Jeder PC greift auf eine oder mehrere Dateien auf einem FTP-Server zu. Die Frage ist allerdings, ob das der FTP Server mitmacht, wenn 7 Leute meinetwegen 5x in der Minute auf ihn zugreifen. Hat da jemand Erfahrung mit?
Über jede Hilfe wäre ich dankbar.
Fred |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 03.01.2011, 19:56 Titel: |
|
|
TPM hat mal eine Bibliothek zu TSNE speziell für Spiele zusammengestellt. Ein Kartenspiel ist da zwar nicht das perfekte Zielprojekt, aber ich bin damit trotz fehlenden Netzwerkkenntnissen sehr schnell zurechtgekommen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 03.01.2011, 20:07 Titel: |
|
|
FredKowalzki hat Folgendes geschrieben: | Was ich mir noch überlegt habe, wäre das über ftp laufen zu lassen.
Jeder PC greift auf eine oder mehrere Dateien auf einem FTP-Server zu. Die Frage ist allerdings, ob das der FTP Server mitmacht, wenn 7 Leute meinetwegen 5x in der Minute auf ihn zugreifen. Hat da jemand Erfahrung mit? |
Oh, das ist ehrlich gesagt gar keine gute Idee.
- Jeder, der mitspielen möchte, muss die FTP-Zugangsdaten kennen und kann somit illegale oder gefährliche Inhalte auf den Server hochladen oder Dateien auf dem Server beschädigen.
- Viele Webhoster erlauben gar nicht die Weitergabe von Zugangsdaten bzw. die Nutzung durch Dritte und würden hier Probleme machen.
- ...
Mein Vorschlag zielte eher in die Richtung ab, dass du auf dem Server eine eigene FreeBASIC-Software als Dienst laufen lässt, die Verbindungen der Clients entgegennimmt und das Spiel organisiert.
Diese würde nicht auf FTP aufbauen, sondern einem eigenen Protokoll, das viel einfacher als FTP definiert sein könnte.
Du kannst dir mal die Codes zu einfachen Clients und Servern mit TSNE ansehen. Ein Chatsystem ist als Anschauungsobjekt hier besonders geeignet. Ich glaube der Autor der TSNE hatte mal ein solches Code-Beispiel veröffentlicht.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 05.01.2011, 10:20 Titel: |
|
|
Ich habe mir jetzt mal intensiv TSNE angeschaut. Hm. Um das verwenden zu können bräuchte ich einen Beispielcode wie der Client zum Server den String "Hallo ich bin ein Client" übergibt und einen Beispielcode wie der Server den Client antwortet "Und ich habe dich gehört" oder sowas. Denn ich verstehe den Code nicht einmal ansatzweise.
Genau das schreckt mich also eher ab TSNE zu verwenden, denn ich würde etwas benutzen, was ich nicht verstehe. Bei eventuellen Fehlern könnte ich nichts korrigieren.
Noch einmal zur FTP Idee:
Kenn- und Passwort kann im Programmcode enthalten sein. Somit muss der Mitspieler Kenn- und Passwort nicht kennen. Bei Bedarf kann ich jederzeit mein FTP Passwort ändern. Dann kommt niemand mehr auf meinen FTP Server.
Ich kann mir auch einen eigenen FTP Server einrichten. Dann landen die Leute auf einem meiner Rechner per Dyndns, wäre ja auch durchaus machbar.
Fred |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.01.2011, 11:32 Titel: |
|
|
Zitat: | Kenn- und Passwort kann im Programmcode enthalten sein. |
Da lassen sie sich aber recht leicht auslesen - aus dem Quellcode sowieso, und fest programmierte Strings lassen sich aus einem compilierten Programm auch recht leicht extrahieren.
Hast du dir TSNEPlay schon angesehen? Da liegt auch ein Beispielprogramm für den Datenaustausch bei.
Mit TSNEPlay_SendMSG wird eine Nachricht gesendet (an alle oder an eine spezielle Nutzernummer), mit TSNEPlay_Message (welches als Thread ständig im Hintergrund mitläuft!) wird auf die Nachricht reagiert.
Ein knapperes Beispiel als das genannte ist nur schwer möglich, weil man doch eine ganze Menge an Funktionen immer "mitschleppen" muss. Du kannst dir gern eine frühe Fassung meiner FBmeise ansehen - da sind Server und Client klar getrennt - aber ich glaube nicht, dass die Funktionsweise von TSNE da klarer hervorgeht als im genannten Beispiel. Die Netzwerksachen stehen übrigens weitgehend in der fbmeise.inc _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 05.01.2011, 13:48 Titel: |
|
|
Ja, da fängt es leider schon an.
Die Testplay.bas:
'Das Programm wird auf 2 arten gestartet
'<Programmname> server
'<Programmname> <hostname>
Welches Programm muss aufgerufenwerden mit dem Parameter "Server"?
If Command() = "server" Then...
Ich habe folgendes probiert:
command="Server"
Command("Server")
Geht beides nicht. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 05.01.2011, 14:02 Titel: |
|
|
Du musst das Programm zweimal starten, z. B. beide Male über (zwei verschiedene) Konsolen - einmal mit dem Befehl
Code: | testplay.exe server |
und einmal z. B. mit dem Befehl
Code: | testplay.exe localhost |
Beide Male vorausgesetzt, dass du testplay.bas zu einer testplay.exe compiliert hast. "localhost" funktioniert natürlich nur, wenn du beide Male denselben Computer verwendest; sonst muss da die Adresse des Server-Computers rein.
Diese beiden Programme sollten jetzt miteinander kommunizieren können.
(nb: "Server" ist etwas anderes als "server") _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 05.01.2011, 22:38 Titel: |
|
|
Schau Dir sonst als Beispiel mein Rasterbike an. Dort gibt es einen Client (QB-Programm damals; dürfte in FreeBasic logischerweise den eleganteren Code geben!) und einen Server (ist dort ein C-Programm für vorzugsweise Linux).
Dateien sind aus meiner Sicht der komplett falsche Ansatz! Die bessere Vorstufe: Nimm doch sonst einmal ein Nullmodemkabel und spiele mit einer Terminalemulation auf beiden Rechnern etwas! Anschliessend ersetzst Du die Terminalemulationen durch Beispiele wie hier (müssten in FreeBasic sogar 1:1 umsetzbar sein!). Bald merkst Du hoffenlich selber, das wie Telefonleitungen geschaltete Verbindungen (Nachrichten von A nach B schicken) der viel klügere Weg ist als da mit irgendwelchen temporären Dateien herumhantieren, wo noch auf Locking-Mechanismen geachtet werden muss.
Sobald Du die Beispiele mit der Nullmodemkabelkommunikation verstanden hast, ist es nur noch ein kleiner Schritt auf TCP/IP: Dort stellst Du Dir den Serverprozess als PC mit haufenweise COM-Ports eingebaut vor, bei welchem gleich haufenweise Socketverbindungen offen sind. Übrigens braucht es nicht einmal Threads, aber Du musst die vielen gleichzeitig geöffneten Sockets mit select() (So zumindest der Standard-C-Bibliothek-Aufruf jedes unixoiden Betriebssystems. An die TSNE & Co.-Profis: Vielleicht Hinweis geben, wie dort die entsprechende SUB-Prozedur heisst, um den Prozess schlafen zu legen, bis in einem der Sockets Daten hineinkommen) abwarten.
In Deinem Fall würde ich dann bald einmal als erstes auf dem Papier das Socketprotokoll entwerfen + überhaupt die Aufgabenverteilung, d.h. Schritte, die der Client machen muss und die Schritte vom Server. Dabei kann etwas auf ASCII-Textbasis den Vorteil haben, dass Du mit der Programmierung vom Server zuerst starten kannst und dabei den Client mit einem einfachen Telnet-Aufruf simulierst (=gewissermassen Deine Terminalemulation!). Übrigens hätte ich für Linux noch ein kleines Socket-Debugging-Tool (ist in C geschrieben), wobei aber "tcpdump" und "tcpflow" in diesem Zusammenhang ebenfalls sehr wertvolle Arbeit verrichten können.
Zu Beginn würde ich den Server nur für ein einziges Spiel auf einmal designen, erst später dann der Schritt für auf Dauerbetrieb als Dienst (Microsoft) bzw. Daemon (Linux). _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 06.01.2011, 17:35 Titel: |
|
|
Vielen Dank für eure Tips.
Ich bin allerdings Hobbyprogrammierer in BASIC, kein Informatiker.
TSNE ist mir 10 Nummern zu groß, leider.
Meine einzige Chance TSNE zu benutzen wäre, wenn ich einen Beispielcode hätte wo Server und Client Strings ausgeben und miteinander kommunizieren. Dann könnte ich vielleicht den Code für meine Zwecke via VERSUCH verwenden. Begreifen tue ich mangels Hintergrundwissen das ganze nicht.
Im Prinzip braucht der Server ja nur soetwas wie ein Echo sein. Speler 1 spielt Herz Ass aus. Diese Info sendet er an den Server. Der Server empfängt diese Nachricht und sendet sie an die Clients. Alles andere wäre dann Aufgabe der Clients. Gibt es für sowas nicht einen Beispielcode? Bin ich wirklich der einzige, der sowas mal machen wollte?
Fred |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 06.01.2011, 18:18 Titel: |
|
|
Vor längerer Zeit habe ich ein Beispiel gemacht, indem ich die Funktionen der TSNE in ein UDT gepackt:
Server
Client
Die Programme machen nicht viel außer einen String zu senden.
Es gibt im Übrigen auch ein Tutorial zu TSNE im Portal. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 06.01.2011, 18:31 Titel: |
|
|
Hier habe ich auch nochmal einen Server und einen Client; ob es aber trotz aller Bemühungen wirklich einfacher ist, weiß ich nicht.
Server starten, Client gern auch mehrmals gleichzeitig starten (maximale Zahl 10, wobei da vielleicht der Server mitgerechnet ist). Ein Tastendruck wird als Meldung an alle anderen Fenster übertragen.
Der Server "tut" im Prinzip gar nichts, außer als Server zu dienen. Der Client "tut" zweierlei: ganz unten ist das eigentliche Programm - Tastatur abfragen und evtl. Meldung losschicken. In der Funktion TSNEPlay_Message wird auf die Meldung anderer reagiert.
Überhaupt dienen alle Prozeduren nur dazu, auf Ereignisse zu reagieren. Die meisten machen in meinem Beispiel überhaupt nichts ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 06.01.2011, 22:06 Titel: |
|
|
FredKowalzki hat Folgendes geschrieben: | Im Prinzip braucht der Server ja nur soetwas wie ein Echo sein. Speler 1 spielt Herz Ass aus. Diese Info sendet er an den Server. Der Server empfängt diese Nachricht und sendet sie an die Clients. |
Sehe ich allerdings etwas anders! Jede Client-Server-Anwendung stellt bereits eine verteilte Anwendung dar. Somit müssen die Aufgaben klar verteilt werden! Als konkretes Beispiel mein Rasterbike.
Aufgaben des Clients:
- Fensterausschnitte aufgrund der Neupositionsnachricht aufbauen (Scrolling und die korrekten Grafiksymbole)
- Tastendrucke zum Steuern 1:1 dem Server melden
Aufgaben Server:
- macht den Zeittakt / Geschwindigkeit (dort mit einem select() wegen den jederzeit zu empfangenden Tastendrücke gelöst mit Timeout), wobei bei Auftreten dieser Timeouts jedes Mofa einen Schritt vorwärtsbewegt wird.
- führt die Bewegrichtung der Mofas nach, wenn eine Tastendruck-Nachricht empfangen wurde
- bestimmt das Spielende mit einer speziellen Ende-Nachricht
- wertet Kollisionen aus
Grundphilosophie: offenes Internet = gehe immer vom Schummel-Spieler aus, der mit manipuliertem Client mitspielt -> somit darf sich der Server grundsätzlich nie aus dem Tritt bringen lassen, wenn manipulierte Nachrichten vom netcat-Hexdump-"Mitspieler" (Angreifer!) hineinkommen! Dies ist auch wichtig, damit Dein Server nicht als Einfallstor für einen Pufferüberlaufsangriff verwendet werden kann. So habe ich z.B. eine maximale Nachrichtenlänge definiert und verwerfe eine empfangene Nachricht, wenn sie zu lange ist sowie ich ignoriere eine syntaktisch falsche Nachricht ebenfalls.
Für Dein Kartenspiel braucht es genauso Rollen!
Client:
- Nimmt zu Beginn eine Nachricht der verteilten Karten entgegen + Positionsnachricht am Spielertisch
- kümmert sich um die hübsche grafische Darstellung der Karten (für den Server ist jede Karte nur eine codierte Zahl!)
- Nimmt Nachricht vom Server entgegen, dass Spieler am Zug -> Spieler kann auszuspielende Karte mit der Maus anklicken -> sendet Nachricht der geklickten Karte zurück. Server meldet ACK-Nachricht, wenn die Karte zulässig ist (=der Spieler besitzt sie und darf sie auch spielen, z.B. weil die Farbe angeben-Spielregel nicht verletzt wird) -> Client löscht grafisch die Karte daraufhin, so dass eine weniger erscheint
- wenn Spieler gerade nicht am Zug ist: nimmt Meldung entgegen, welche Karte ein anderer Spieler gespielt hat und führt dies nach.
Server:
- Mischt zu Beginn die Karten und verteilt sie (=an jeden Socket die Nachricht "Spiel beginnt, Du hast Herz König/Bauer/7, Karo 9,6, Schaufel As, König ... und bist der 3. Spieler vom ausspielenden Spieler aus gesehen" senden)
- sendet "Du bist am Zug" und erwartet gewählte Karte, anschliessend Bestätigung mit ACK und gibt eine "Spieler X hat Y ausgespielt" an die 3 übrigen Spieler heraus.
- sendet Nachricht der Art "Stich geht an Spieler 2." an jeden Spieler
- meldet "Spiel beendet", wenn jeder seine 9 Karten ausgespielt hat und meldet Punkte und damit den Sieger
- kümmert sich generell um die Einhaltung der Spielregeln
Ebenfalls wichtig: Errorhandling, also was bei Fehlern passiert
- Spieler lässt sich zuviel Zeit -> z.B. Computer (Server selber) "spielt" für diesen Spieler (z.B. wählt per Zufallsgenerator eine gerade gültige Karte selber aus!) -> Nachricht "Leider nicht gezogen, ich habe für Dich Herz 6 ausgespielt" noch vorsehen.
- DSL-Modem crasht ab und Socketverbindung stirbt -> Computer (Server) soll diesen Spieler ebenfalls übernehmen. In einer späteren Phase kannst Du auch ein "Willst Du für X weitermachen?"-Management implementieren.
Tipps zum Nachrichtenprotokoll: Ich würde ein ASCII-Format verwenden (erlaubt das Testen mittels Telnet!), dabei CR/LF als Synchronisationszeichen verwenden. Das bedeutet, dass Du immer die am Socket empfangenen Bytes liest, aber nur maximal soviele, wie noch von der maximal zulässigen Nachrichtenlänge erlaubt sind. Sobald sich darunter das CR/LF befindet, extrahierst Du diesen Stringteil und wertest den Befehl aus. Rest verbleibt im Puffer, bis das Ganze wiederum mit CR/LF komplett ist => Wenn die zulässige Nachrichtenlänge erreicht wurde, aber kein CR/LF dabei, dann Nachricht verwerfen! Übrigens auch der Client kannst Du vom Grundprinzip so aufbauen, d.h. dieser fragt parallel Tastatur, Maus und den Socket laufend ab.
Übrigens auch immer darandenken: Wenn Du in dem Sinn mit nur 4 PCs spielen möchtest (LAN-Party), dann ist es kein Problem, dass einer der Spieler den Client und Server bei sich als parallel laufende Prozesse laufen lässt und über 127.0.0.1 verbindet! Dabei musst Du als Programmierer nicht einmal diesen Fall berücksichtigen, weil das Betriebssystem alles Notwendige für Dich erledigt! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 07.01.2011, 11:58 Titel: |
|
|
@nemored
Ich habe mir deinen Server und deinen Client heruntergeladen, habe bis jetzt den Server auf PC1 und den Client auf PC2 laufen lassen. Was soll ich sagen: Ich bin begeistert!
Das ist genau das, was ich wollte.
Jetzt geht es natürlich an das modifizieren und an die Fehlerbehandlung.
Wenn z.B. Client3 die Internetverbindung unterbricht und er sich wieder neu verbindet, muss er sich ja wieder als Client3 anmelden können. Oder wenn der Server die Internetverbindung abbricht, dann müssen sich natürlich alle Clients mit der selben Nr wieder anmelden.
Ich denke, ich habe, dank euch allen, nun eine Grundlage auf die ich aufbauen kann. Ihr seit echt klasse!
Vielen Dank für eure Denkanstöße - ich werde mich bestimmt noch einmal wieder melden, wenn ich nicht weiterkomme
@dreael
Vielen Dank für deine Tips.
Dazu möchte ich sagen, dass ich kein Programm für fremde Leute schreibe, sondern tatsächlich nur für Freunde. Da schummelt niemand. Davon einmal abgesehen, dass niemand meiner Freunde in der Lage wäre ein Programm zu modifizieren (die sind froh, wenn sie richtig klicken können), so sind wir aus dem Alter heraus, wo man mit Schummeln oder Cheats gewinnen möchte. Wir wollen gemeinsam Karten spielen, nur leider können wir uns, da wir in ganz Deutschland verteilt sind, nicht so oft treffen, wie wir es gerne hätten. Deshalb die Idee des Online-Kartenspiels.
Da wir miteinanander spielen wollen entfällt der Dummy-Ersatzspieler, falls jemand die Verbindung abbricht. dann muss der abwesende Spieler sich neu verbinden - wie auch immer.
Da der Server immer an alle sendet, also tatsächlich "nur" ein Echo ist, muss ich jetzt mal gucken, wie ich es mache, dass sich einzelne Clients b.B. angesprochen fühlen. Aber das ist halt die "Bastelei", die ich so liebe am Programmieren.
Eine Frage noch zu den Ports (Wer denkt sich solche Namen in der IT Szene eigentlich aus? Hafen...): Kann ich irgendwelche Ports benutzen (1234) oder gibt es, wenn es über das Internet läuft, bestimmte Ports, die man nehmen sollte?
Also vielen Dank nochmals an alle. Ihr habt mir sehr geholfen!
Fred |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 07.01.2011, 12:42 Titel: |
|
|
FredKowalzki hat Folgendes geschrieben: | Kann ich irgendwelche Ports benutzen (1234) oder gibt es, wenn es über das Internet läuft, bestimmte Ports, die man nehmen sollte? |
Wichtig ist eigentlich nur, dass auf deinem Katenspielserver kein anderer Dienst auf dem gleichen Port lauscht. Ports von Windows-Systemdiensten wie 135 und 445 sollten daher nicht gewählt werden, wenn die Serversoftware mal auf Windows laufen soll. Außerdem sollten die Ports der gängigen Protokolle wie HTTP (80), FTP(20/21), DNS (53), ... nicht* benutzt werden, damit sich nichts in die Quere kommen kann.
* Anmerkung: Gleichwohl gibt es Fälle, in denen man für eigene Protokolle absichtlich den HTTP-Port 80 zweckentfremdet, um Firewall-Einschränkungen zu umgehen.
Eine knappe Übersicht über die wichtigsten Ports, die man nicht in Beschlag nehmen sollte, gibt es hier: Wikipedia: Port (Protokoll)
Eine umfassendere Liste mit Hinweisen und praktischen Links zu den jeweiligen Protokollen findet sich in der englischen Wikipedia: http://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Alternativ tut es auch ein Aufruf von
Code: | cat /etc/services | less |
in der Linux-Konsole.  _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.01.2011, 12:45 Titel: |
|
|
Port heißt zwar Hafen, aber genauso Eingang oder Öffnung ...
Die Identifikation mittels der ID ist, gerade bei Verbindungszusammenbruch und Neuverbindung, vermutlich eher fehleranfällig. So wie ich das sehe, wird diese ID einfach durchgezählt. Ich würde die eindeutige Identifizierung eher über den Anmeldenamen des Clients laufen lassen (der dritte Parameter von TSNEPlay_ConnectToServer, wo bisher "Client" & zufallsnummer steht). Eine Nachricht würde ich tatsächlich immer an den Server schicken, der dann überprüft, an wen sie gerichtet ist, und entsprechend weiter verschickt. Du kannst die Nachricht natürlich auch einfach an alle schicken, und jeder Client muss dann selbständig schauen, ob er mit dieser Nachricht etwas anfangen kann. Ich könnte mir z. B. vorstellen, dass die Nachricht ganz einfach immer mit dem Namen des Clients beginnt, für den sie gedacht ist; bekomme ich eine Nachricht ohne meinem Namen am Anfang, dann ignoriere ich diese einfach. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.01.2011, 13:45 Titel: |
|
|
FredKowalzki hat Folgendes geschrieben: | Eine Frage noch zu den Ports (Wer denkt sich solche Namen in der IT Szene eigentlich aus? Hafen...): Kann ich irgendwelche Ports benutzen (1234) oder gibt es, wenn es über das Internet läuft, bestimmte Ports, die man nehmen sollte? |
Von IANA gibt es eine offizielle Portreservationsliste:
http://www.iana.org/assignments/port-numbers
Grob gesagt gilt:
0-1023 = Well Known-Portbereich (auf Linux und unixoiden Betriebssystemen generell darf hier nur "root" einen bind() machen)
1024-41951 = Registered Port-Bereich; prinzipiell könntest Du hier, wenn Dein Programm als ausgereiftes Projekt steht, eine Portnummer beantragen. Während der Entwicklung würde ich aber temporär einen bisher noch nicht reservierten (unassigned)-Port nehmen
49152-65535 = Dynamic Port-Bereich: Quellport von Sockets + Dienste, die ihren Port dynamisch reservieren, nehmen den Port hier heraus
Hinweis: Microsoft hält sich seit Vista/Server 2008 korrekt an den Dynamic-Portbereich, bei XP/Server 2003 und älter wurde fälschlicherweise 1024 an aufwärts dynamisch für SVCHOST.EXE-Dienste verwendet.
Unter dem Strich gilt für Dich: Wähle etwas aus dem 1024-49152 aus, welches im Moment noch "unassigned" ist. Falls Dein Kartenspiel später einmal ein grösseres Projekt wird, dass Du auch veröffentlichst, spricht nichts dagegen, eine Portnummer bei IANA dafür reservieren zu lassen, dann hast Du analog Microsoft mit z.B. 1433 für SQL-Server ebenso Deinen eigenen Port fürs Kartenspiel!
Ein wichtiger Kommandozeilenbefehl an dieser Stelle:
=> Versuche die dortige Liste zu verstehen! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
FredKowalzki
Anmeldungsdatum: 03.01.2011 Beiträge: 13
|
Verfasst am: 09.01.2011, 17:26 Titel: |
|
|
So, die erste Sache wo ich nicht wirklich weiterkomme.
Ich habe testweise den Server vom Netz genommen, damit er nicht mehr erreichbar ist und nach einer kleinen Weile wieder rangeklemmt.
Die Clients kommen allerdings dann nicht mehr auf den Server. Die Netzwerkmeldung lautet: TSNEPlay_NotReadyForNewConnection
Wenn ich den Client neu starte, dann geht es wieder, aber das ist ja nicht Sinn der Sache, mitten im Spiel das Spiel von vorne anzufangen.
Ich muss den Client also "ready für neue Connections" machen. Blos wie?
Fred. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|