Fragen zur Netzwerkprogrammierung



  • Hiho,

    ich bin grade an den Vorbereitungen für mein nächstes Programmierobjekt, ein Kartenspiel, welches über Netzwerk/Internet gespielt werden kann.

    Es soll über Server-Client-Verbindungen realisiert werden, also einer der bis zu 4 Spieler startet den Server, die anderen joinen das Spiel.
    Da meine Kenntnisse in Netzwerkprogrammierung noch recht gering sind, hab ich schon mal eine Inetrecherche gestartet.
    Bin dabei auf das Open Book "C von A bis Z" gestoßen http://openbook.galileocomputing.de/c_von_a_bis_z/025_c_netzwerkprogrammierung_001.htm#mja8101c6e0e4cb2e6fd8312114dad30d7
    welches ein Kapitel über Netzwerkporgrammierung enthält.
    Gleichzeitig konnte ich auch einen Blick in das Buch "C++ von A bis Z" werfen. Und mir ist aufgefallen, dass das Kapitel über Netzwerkprogrammierung identisch zu sein scheint. Daraus schließe ich mal, dass C++ keine weiteren neueren Möglichekiten zur Netzwerkprogrammierung bietet.

    Nun meine Fräge: Bin ich mit der in den Büchern beschriebenen Art und Weise der Netzwerkkprogrammierung richtig beraten um meine Kartenspielidee umzusetzen, oder gibt es für C/C++ noch andere, vielleicht einfachere, Möglichkeiten um Server-Client Verbindungen zu realisieren



  • Jo, sauber die beiden Bücher mit dem wohl schlechtesten Ruf "evar" rausgesucht. 👍
    So, und jetzt mal zum Thema. Momentan kennen weder C noch C++ irgendetwas Netzwerkartiges. Bei C++ ist es in Planung, und vielleicht schwappt es dann auch auf C über, aber das ist Zukunfstmusik. Netzwerkprogrammierung funktioniert also nur über die jeweilige Betriebssystem API. Die so genannten BSD Sockets werden allerdings relativ weitreichend unterstützt, leider mit ein paar Unterschieden zwischen Betriebssystemen. Während die Unix Fraktion sinnvollerweise void* und size_t nutzt, nutzt Windows char* und int. Und es gibt noch ein paar andere Unterschiede. (WSAStartup(), WSACleanup() etc. gibt es z.B. nur auf Windows.) Aber das wird dir wahrscheinlich kaum auffallen.
    Nun zum Unterschied zwischen C und C++: Die Betriebssystem APIs sind traditionell C APIs insofern gibt es hier keinen Unterschied. Aber die Art wie man diese APIs verpackt, nun ja, da liegen Welten zwischen. Während du in C wohl gerade mal ein paar Hilfsfunktionen bastelst, kennt C++ Klassen bzw. RAII:

    enum class protocol
    {
      ...
    };
    
    enum class send_flags
    {
      ...
    };
    
    enum class recv_flags
    {
      ...
    };
    
    class socket
    {
    public:
      typedef .. native_handle_type;
    
    private:
      native_handle_type native_handle_;
    
    public:
      socket(protocol p, std::uint16_t port);
      socket(socket&& rhs); // move constructor
      ~socket(); // RAII: Hier wird der Socket geschlossen
      socket& operator = (socket&& rhs); // move operator =
      std::size_t send(const void* buf, std::size_t size, send_flags flags);
      std::size_t recv(void* buf, std::size_t size, recv_flags flags);
    private;
      // non copyable
      socket(const socket&);
      socket& operator = (const socket&);
    };
    

    Das ist jetzt nicht wirklich gut durchdacht, das mit den Flags könnte man vielleicht mit Überladungen regeln, eventuell will man auch garkeine einfache Socket Klasse, sondern nur einen Server und einen Clienten, aber ich denke du verstehst den Unterschied. Ach so ja, es gibt auch boost::asio als C++ Bibliothek. Die ist zwar durchaus gut (und insbesondere asynchron thread safe, insofern wahrscheinlich schneller als alles was du basteln könntest), allerdings könnte das für dich auch leichter Overkill sein.



  • Erstmal Danke für deine Antwort.
    Das mit den Büchern war wohl ein Glücksgriff meinerseits :).

    Ich werd mich dann mal als nächstes näher mit Socketprogrammierung auseinandersetzen.
    Gibts dazu vielleicht noch gute Tutorials irgendwo online?



  • weder C noch C++ irgendetwas Netzwerkartiges

    Fuer C wuerde ich das nicht unterschreiben. Ansonsten: http://beej.us/guide/bgnet/



  • Ich hab natürlich vor meiner eben gestellten Frage schon mal Google angeworfen und haben folgendes zum Thema "Einstieg in Socketprogrammierung in C++" gefunden:
    http://www.alhem.net/Sockets/
    http://www.c-worker.ch/
    http://www.zotteljedi.de/doc/socket-tipps/index.html

    Sind diese Tutorials zu empfehlen, oder sollte ich davon irgendwas meiden?



  • knivil schrieb:

    weder C noch C++ irgendetwas Netzwerkartiges

    Fuer C wuerde ich das nicht unterschreiben.

    Aha? Dann schieß mal los, die Stelle muss ich im Standard wohl überlesen haben.

    @butterbemme
    Die bekleckern sich alle nicht mit Ruhm, aber sind schon ganz okay. Du solltest dich nur darauf konzentrieren Netzwerkprogrammierung zu lernen, und nicht unbedingt deren Programmierstil übernehmen. 😉



  • cooky451 schrieb:

    ... und nicht unbedingt deren Programmierstil übernehmen. 😉

    Dafür ist es eh schon zu spät, ich hab mir schon eine eigene "Sauklaue" angewöhnt. 😃
    Hast du vllt noch Tutorials auf Lager, die sich mit Ruhm bekleckern?



  • Nope, leider nicht.



  • C-API fuer Sockets ist standardisiert. Aber hey, du kannst natuerlich auch kleinkariert sein.



  • butterbemme schrieb:

    ich bin grade an den Vorbereitungen für mein nächstes Programmierobjekt, ein Kartenspiel, welches über Netzwerk/Internet gespielt werden kann.

    Ich würde an deiner Stelle SFML 2 verwenden, damit kannst du sowas portabel und relativ simpel realisieren. Auch abgesehen von Netzwerken bietet SFML sehr nette Features im Bezug auf Spieleprogrammierung.

    knivil schrieb:

    C-API fuer Sockets ist standardisiert. Aber hey, du kannst natuerlich auch kleinkariert sein.

    Ist ja wohl klar, dass cooky451 von der Standardbibliothek gesprochen hat.



  • DER Standardbibliothek, einer Standardbibliothek, ... ich weiss ich weiss, aber cooky ist mein Fan. Und Fans brauchen ab und an Aufmerksamkeit.

    ich bin grade an den Vorbereitungen für mein nächstes Programmierobjekt, ein Kartenspiel, welches über Netzwerk/Internet gespielt werden kann.

    Ich rate dir zu etwas einfacherem, Echo-Server oder Chat.


Anmelden zum Antworten