Netzwerk Mulitthread - Prozesse und Auslastung



  • Hallo,

    ich werd verrückt. Ich such jetzt seit ca. 1 Stunde das Internet ab um Antowrt auf einige Fragen zu bekommen.

    Ich habe das Buch "C++ von A bis Z" und "Unix/Linux-Programmierung" von Jürgen Wolf gelesen und soweit auch verstanden (Hoffe ich *g*)

    In beiden Büchern gibt es eine Anleitung zur Netzwerkprogrammierung. Auch wie man einen Server baut und die passenden Clienten. Sowphl für C als auch als Klassen für C++.

    Dort wird auch aufgezeigt wie man mit Hilfe von fork() einen Multi-Server erstellt. Allerdings wird auch auf die Gefahr hingewiesen, das die Auslastung am Server dadurch sehr hoch ist.

    Dann wird ein Beispiel mit Hilfe des Befehls von select() gezeigt, das die Auslastung deutlich verringert. Das Problem an diesem Beispiel ist, das der Client sich abmelden muss damit beim Server die Verbindung getrennt wird. Passiert das nicht, wrd dauernd auf dem Socket des "verschwundenen Clienten" gelesen.

    Ich habe daher zwei Fragen:

    1. Gibt es irgendwo ein Beispiel im Internet wo man mit Hilfe eines select()-Befehls einen Multi-Server (z.B. für einen Chat oder ein kleines Netzwerkspiel) erstellen kann, wobei auch Fälle wie Timeout oder "unkontrollierte Abmeldung" berücksichtigt werden?

    2. Wenn man von dem select()-Befehl mal weg geht und mit fork() neue Prozesse startet (pro Connection ein Prozess), ab wann macht das keinen Sinn mehr, weil man vor lauter Prozessen den Server "in die Knie" zwingt.

    3. Gibt es einen besseren Ansatz wie man einen Mulit-Server erzeugen kann?

    Zur Hintergrundinfo. Ich möchte einen rundenbasierendes Kartenspiel erzeugen (ähnlich wie Uno, also Spielerzahlunbegrenzt) mit einer eingebauten Chat-Funktion. Die Anzahl meiner Freunde und Kumpels ist sehr groß, so dass ich doch damit rechnen kann, dass ich Mal kleine Tuniere veranstalten kann, wo dann so 50-60 Leute gleichzeitig mitspielen werden (hatten wir schon bei anderen Spielen).

    Netzwerk ist für mich noch ein neues Thema. Der Server soll unter Linux laufen, die Clienten mit Hilfe von wxWidgets unter Linux und Windows (und evtl auch mal unter Mac, aber da haben wir noch keinen Spieler).

    Ich hoffe ihr könnt mir helfen den Nebel des Web etwas zu lüften.
    Danke,
    Stefan



  • Meine (bescheidene) Erfahrung hat gezeigt dass ein "gemischtes" Modell am besten Funktioniert:
    Du hast ein oder mehrere Prozesse (z.B. über fork)
    Jeder Prozess hat 1 oder mehrere Threads
    Jeder Thread hat dann z.B. über select() mehrere Clients zu verwalten, so viele wie eben anfallen.

    Wenn du das dynamisch gestaltest, so dass du beispielsweise durch Parameter beim Start die jeweilige Anzahl vorgibst, kannst du notfalls auch bei vielen Spielern einfach ausprobieren was am besten funktioniert. Bei mir hat sich gezeigt dass meistens ein Prozess mit wenigen Threads (z.B. entsprechend der CPUs/Cores) am besten läuft.

    Ob das wirklich die beste/praktikabelste Vorgehensweise ist weiß ich nicht, ich bin auch noch nicht so lang an dem Thema dran. Von daher bin ich auch gespannt was noch so für Antworten kommen.

    Aber ob ein rundenbasiertes Spiel dem Server wirklich so viel Leistung abverlangt 😕



  • zu 1)
    Mhh. So direkt habe ich keinen Link. Du könntest z.B. ähnlich dem IRC Protokol den Server eine Nachricht an alle Clients verschicken lassen. Kommt nichts zurück ist der Client für den Server tot.
    Das machst du x Sekunden (oder Millisekunden).

    zu 2)
    Keine Ahnung 🙂

    zu 3)
    Stichwort: Thread- bzw. Prozess-Pool.

    Soweit ich das noch richtig weiß, ist select + Threads keine gute Idee (select besitzt statische Variablen; das gibt Chaos).
    Versuch es mit einem Prozess-Pool (z.B. 5 Prozesse beim Start erzeugen) + select.

    Bei 100 Leuten sollte es eigentlich auch nicht problematisch sein nur einen Prozess zu haben. Für den Chat dürfte das reichen.

    Das Socket-Buch von http://www.zotteljedi.de/ find ich eigentlich ganz gut.


Log in to reply