Netzwerk: Server und Client
-
Hallo,
ich habe schon das ein oder andere Projekt realisiert, das mit Netzwerken zu tun hatte, server- sowie clientseitig. Mir ist auch vollkommen bewusst wie die Verbindung, Sendung und das Empfangen von Daten funktioniert (ob TCP oder UDP spielt jetzt mal keine Rolle).
Was ich mich aber eigentlich viel eher frage, ist:
Angenommen ich möchte einen Chat in C++ programmieren. Und ich möchte, dass der Client sich mit dem Server verbindet. Server sowie Client sind auf unterschiedlichen Systemen in unterschiedlichen Netzwerken (kein LAN). Jetzt muss ja irgendein gemeinsames Medium genutzt werden um die IP-Adressen (evtl. Ports) auszutauschen (Port Mapping mal außer Betracht gelassen). Anbieten würde sich ja irgendeine Form von Webserver (HTTP, FTP, MySql!?), der immer erreichbar ist.Und genau da hake ich ein; Wie wird sowas gemacht? Man könnte sich ja ganz simpel vorstellen auf den FTP zuzugreifen und eine Datei anzulegen in der man seine IP-Adresse ablegt. Sobald der Client connected ist, wird die Datei wieder gelöscht. Das ganze stelle ich mir nur etwas stumpf vor, da es hier meiner Meinung nach mehrere Probleme gibt:
- Ist das Programm abgestürzt, kann es die Datei vom FTP nicht mehr löschen, ergo -> Der Server wird für den Clienten als verfügbar angezeigt, obwohl er es nicht ist
- Es gibt Zugriffprobleme sobald mehrere Server gestartet werden und, so unwahrscheinlich es auch ist, diese Server zum gleichen Zeitpunkt versuchen eine Datei mit dem gleichen Namen zu erstellen
- und und und...
Daher meine konkrete Frage: Würde man so ein Projekt mit variabel vielen Servern/Clienten starten, wie würde man soetwas umsetzen? Gibts da vorgefertigte Konzepte? Ich weiß dass es die Möglichkeit gibt, mit daemon ein Skript auf einem Webserver ablaufen bzw. loopen zu lassen. Ich hätte es aber gerne etwas einfacher.
Lieben dank im voraus!
-
hat ja an sich nix mit C++ zu tun.
aber mal zum thema.
ich hab vor paar jahren mal einen kleinen chat geschrieben.
als hilfe hab ich einen webspace mit unterstuetzung von PHP und mysql genommen.
da liefen dann 4 scripte drauf:
1. uebergabe der IP adresse des chat client. hab ich jede minute gemacht.
das script hat dann auch immer die liste der vorhandenen IPs gecheckt, wie lange sie nicht mehr upgedated worden sind. bei aelter als 1 minuten und 10 sekunden wurde sie geloescht
2. das löschen der IP adresse. bedeutet: client wird beendet.
3. registrieren der verfuegbaren chats (server)
4. abmelden eines servers
der server selbst lief dann in einem client.
jeder konnte einen chat room erstellen und man konnte sich zu jedem verfuegbaren connecten. wenn ein client vom 1. script gelöscht worden war, wurde das dem server mitgeteilt. der meldete sich auhc immer minuetlich am server. dadurch wusste ich im worst case wann ein client unsanft beendet worden war und sinch aufgehaengt hatte. oder einfach keine internetverbindung mehr hatte.gibts viele moeglichkeiten sowas aufzuziehen
Meep Meep
-
Zu 1) Wenn ein Programm abstürzt (ich verstehe Dich so, dass Du den Server meinst), gibt es immer ein Problem, egal, wie auch immer man das Zusammenkommen organisiert. Selbst wenn der Client die IP-Adresse des Servers 'wüsste', hat er ein Problem, wenn der Server abgestürzt ist.
In dem von Dir vorgeschlagenen Szenario würde ich vorschlagen, dass der Client nach einer vorgegebenen Anzahl von vergeblichen Verbindungsversuchen die Server-IP vom FTP-Server löscht.Zu 2) Warum sollten die Server alle eine eigene Datei schreiben? Sie können doch alle in dieselbe schreiben?
Zu 3) und und und ...
-
Hallo,
danke euch Beiden für die Antworten.
@Meep Meep
Im Großen und Ganzen kann ich deine Schritte nachvollziehen. Auch wenn es sicherlich eine Lösung auf das im Anfangspost beschriebene Problem ist, würde ich einen galanteren Lösungweg wählen (falls es ihn gibt).Gibt es für dieses Problem nicht andere Ansätze? Es gibt doch immerhin viele die ein kleines Spiel proggen und im kleinen Rahmen Netzwerkfunktionen anbieten möchten. Machen die das etwa auch mit PHP-Skripten und minütlichen Meldungen?
-
Naja, das Problem bei einem "normalen" Webspace wird es sein, dass du da schlecht einen in C++ geschriebenen Server installieren kannst/darfst. PHP wird i.d.R. angeboten und MySQL auch.
Dann könntest du höchsten einen eigenen Server bei dir zuhause bereitstellen. Der sollte dann halt auch eine dauerhafte IP-Adresse haben, sonst ist er auch nicht erreichbar.Gruß,
temi
-
temi schrieb:
Naja, das Problem bei einem "normalen" Webspace wird es sein, dass du da schlecht einen in C++ geschriebenen Server installieren kannst/darfst. PHP wird i.d.R. angeboten und MySQL auch.
Dann könntest du höchsten einen eigenen Server bei dir zuhause bereitstellen. Der sollte dann halt auch eine dauerhafte IP-Adresse haben, sonst ist er auch nicht erreichbar.Gruß,
temiIst wohl nett gemeint, aber dein Post geht vollkommen an der Thematik vorbei.
Die Methode von Meep Meep ist eigentlich schon ganz gut. Nur gibt es dafür kein Framework oder sowas? Hat diese Vorgehensweise einen Namen? Ich kann doch nicht der Erste sein der sowas machen möchte.
Weiterhin vielen Dank im voraus!
-
k.A. was du genau wissen willst. So was macht man, indem man einen zentral erreichbaren Kontrollserver hat, bei dem sich die Chat-Clients anmelden. Von diesem können sie dann eine Liste der aktuell verfügbaren Benutzer abrufen, samt deren IP-Adresse, falls die Kommunikation tatsächlich direkt zwischen den Nutzern stattfinden soll anstatt wie üblich über den Server. Das war's. Ob der Kontrollserver jetzt über HTTP ansprechbar ist oder irgendwie anders, ist letztendlich egal und dir überlassen.
Klar wurde sowas schon hunderttausendfach implementiert, aber wenn es dir nur um Arbeitsvermeidung geht, setz halt einen IRC-Server auf.
-
ein framework dafuer ist mir nicht bekannt, da jeder sein eigenes protokoll und bestimmte technologien verwenden moechte. du kannst dir auch einen DynDNS service suchen und alles von daheim aus machen. dann laeuft halt alles ueber die DynDNS adresse deines heimanschlusses. dann kannst alles selber machen und die an/abmeldungen usw. direkt ueber deinen chat-server regeln lassen. wie schon gesagt, es gibt viele verschiedene wege sowas zu realisieren.
Meep Meep
-
ømq ist super um mit messaging Systemen in Gang zu kommen.
http://zeromq.org/code:examples-chat
natürlich sollte man sich schon etwas mit der Ganzen Materie auseinander setzen,
http://zguide.zeromq.org/page:all
mit ØMQ macht mir das aber unglaublich Spass, also vielleicht auch dir.
-
progg0r schrieb:
Ist wohl nett gemeint, aber dein Post geht vollkommen an der Thematik vorbei.
Die Methode von Meep Meep ist eigentlich schon ganz gut. Nur gibt es dafür kein Framework oder sowas? Hat diese Vorgehensweise einen Namen?
Meiner bescheidenen Meinung nach ist die Methode von Meep Meep ganz einfach ein Workaround, um das Problem mit dem zentralen Server zu lösen und was anderes habe ich auch oben nicht geschrieben:
-Hast du einen eigenen öffentlichen Server, dann kannst du darauf auch deinen eigenen Code installieren, der die Anfragen direkt entgegen nimmt und die Clients verwaltet. Das ist sicher die elegante und effiziente Möglichkeit.
-Bist du auf einen anderen Anbieter angewiesen, dann musst du mit dem arbeiten, was dieser auf seinem Server zulässt.
In Zusammenhang mit PHP/MySQL könnte das Serverscript eine einfache Schnittstelle zur DB sein. Der (dezentrale) Chatserver schreibt seine IP in die DB und die Chatclients können nach vorhandenen Servern suchen und sich über deren IP mit diesen verbinden. Das Chatprogramm müsste demnach sowohl als Client als auch als Server agieren können (wie Meep Meep schon geschrieben hat). Beim Beenden des Chatservers löscht dieser seine IP wieder aus der DB. Im Fehlerfall muss man sich überlegen wie man "verwaiste" IPs wieder entfernt.
Bei einem Spiel müsste evtl. die gesamte "Spielwelt" in der DB liegen und alle Clients implementieren die Spiellogik und greifen über die DB-Schnittstelle auf die gemeinsamen Daten zu.
Gruß,
temi