Suche Client-Server-Library



  • hustbaer schrieb:

    @Badestrand: meinst du mit Boost Sockets die ASIO ... oder hab ich da was verpasst?

    Ja ne, genau die meine ich 🙂 Ich arbeite in letzter Zeit meist mit den SFML-Sockets, da ist mir der korrekte boost-Name entflutscht.

    Nur so nebenbei: Ich verstehe nicht, warum alle Socket-Libraries immer die windows.h in meinen hübschen, sauberen Namensraum werfen müssen 😡



  • @Badestrand
    Weil sie vermutlich nicht alles pimpeln wollen. Natürlich gibt es noch die Möglichkeit die benötigten Funktionen in einem eigenen Namespace selbst zu deklarieren (wie es z.B. die Boost.Thread macht wenn man ohne windows.h auskommen will/muss), bloss das ist halt Aufwand den sich die meisten Programmierer sparen. Kannst dich ja bei einem Open-Source Projekt als Freiwilliger melden das zu übernehmen wenn es dich wirklich so sehr stört 😉



  • hustbaer schrieb:

    Weil sie vermutlich nicht alles pimpeln wollen. Natürlich gibt es noch die Möglichkeit die benötigten Funktionen in einem eigenen Namespace selbst zu deklarieren (wie es z.B. die Boost.Thread macht wenn man ohne windows.h auskommen will/muss), bloss das ist halt Aufwand den sich die meisten Programmierer sparen.

    Meistens werden in den Headern ja nur Typen (wie HANDLE) benutzt, solche Sachen kann man ja auch als void* deklarieren und in der Implementation ein bisschen herum-casten. Bei Template-Klassen kann man sich Wrapper-Funcs basteln. Ich find's echt schade, mich stört die windows.h so sehr... Aber ich wusste gar nicht, dass man die windows.h aus boost.thread raus bekommt, muss ich morgen mal ausprobieren, danke für den unbeabsichtigten Tipp 🙂

    hustbaer schrieb:

    Kannst dich ja bei einem Open-Source Projekt als Freiwilliger melden das zu übernehmen wenn es dich wirklich so sehr stört 😉

    Ich wollt's bei SFML übernehmen, aber der Schaffer wollte es lieber selbst machen. Und der hat keine Zeit bzw andere Prioritäten. Wenn alles nur so einfach wär 🙂



  • Badestrand schrieb:

    So ganz blicke ich bei ACE irgendwie nicht durch, eine Client-Server-Architektur finde ich auch nicht 😕

    ACE liefert alle notwendigen Klassen mit, um eine Client-Server Anwendung zu erzeugen, das Protokoll und solche Dinge mußt Du schon selbst definieren, darum kümmert sich ACE nicht. Es ist eher ein Baukasten für Client-Server-Software, den Du selbst mit Leben füllen mußt. Beispiel finden sich im Software Paket. Wenn das nicht in Deinem Sinne ist, sollest Du mal umschreiben was Du unter Client-Server verstehst.



  • ~john schrieb:

    Wenn das nicht in Deinem Sinne ist, sollest Du mal umschreiben was Du unter Client-Server verstehst.

    Stimmt, ich war etwas ungenau. Im Prinzip hätte ich gern, dass ein echo-Server etwa so aussieht (ganz naiv):

    // Server:
    #include "ServerTCP.h"
    
    class RecvCl : public ServerTCP::ReceiverClass
    {
    public:
        bool OnConnect( ServerTCP& server, const IpAddr& ipaddr )  {std::cout<<"Client connected from "<<ipaddr<<std::endl; /*Client annehmen: */ return true; }
        void OnDisconnect( ServerTCP& server, const IpAddr& ipaddr )  {std::cout<<"Client disconnected from "<<ipaddr<<std::endl;}
    
        void OnReceive( ServerTCP& server, const IpAddr& ipaddr, Packet& packet )
        {
            // echo
            str msg;
            if ( packet >> msg )
                server.send( ipaddr, msg );
        }
    };
    
    int main()
    {
        RecvCl recv_cl;
        ServerTCP c( &recv_cl );
        c.DoYourJob( 12345 );
        Sleep( INFINITE );
    }
    
    //Client:
    #include "ClientTCP.h"
    
    class RecvCl : public ClientTCP::ReceiverClass
    {
    public:
        void OnReceive( ClientTCP& client, const IpAddr& ipaddr, Packet& packet )
        {
            str msg;
            if ( packet >> msg )
                std::cout << "received " << msg << " from " << ipaddr << std::endl;
        }
    };
    
    int main()
    {
        RecvCl recv_cl;
        ClientTCP client( &recv_cl );
        if ( client.Connect( "localhost", 12345 ) )
        {
            std::string s;
    	    while ( s != "exit" )
        	{
        		std::getline( std::cin, s );
        		Packet p;
        		p << s;
        		client.send( p );
        	}
        }
    }
    

    Oder so 🙂



  • So ähnlich sieht das mit Boost.ASIO eh aus... was stört dich also an der ASIO?


  • Administrator

    hustbaer schrieb:

    So ähnlich sieht das mit Boost.ASIO eh aus... was stört dich also an der ASIO?

    Wenn ich ihn richtig verstehe, sucht er eine Bibliothek, welche auf Sockets aufbaut, aber für alle Protokolle funktioniert. Also etwas zwischen Boost.Asio und zum Beispiel einer Http-Bibliothek.
    Allerdings kann ich mir fast nicht vorstellen, dass sowas existiert, da das Protokoll so entscheiden für das Verbinden und Reagieren ist. Ich kann mir schlecht vorstellen, dass man sowas verallgemeinern kann.

    Sobald du allerdings eine Bibliothek für ein bestimmtes Protokoll suchst, davon gibt es es meistens wie Sand am Meer.

    Grüssli



  • Dravere schrieb:

    hustbaer schrieb:

    So ähnlich sieht das mit Boost.ASIO eh aus... was stört dich also an der ASIO?

    Wenn ich ihn richtig verstehe, sucht er eine Bibliothek, welche auf Sockets aufbaut, aber für alle Protokolle funktioniert.

    Ne, eigentlich brauch ich gar keine Protokoll-Unterstützung, ich will ja nur ein paar Daten verschicken 😃 Aber bietet asio wirklich so eine einfache Schnittstelle an? Vielleicht sollte ich noch mal die Doku lesen, hatte asio aber so verstanden, als dass es kaum was anderes macht, als die Socket-Funktionen in Klassen zu verpacken.

    Mein Wunsch-Bibliothek soll TCP- und UDP-Sockets unterstützen, der Server-Teil soll die Clients verwalten und mir ein einfaches Interface (wie z.B. eben mit den Callbacks) anbieten. Mehr brauch ich gar nicht. Mit "Clients verwalten" meine ich auch nur, dass der Server automatisch Verbindungen entgegennimmt, Nachrichten empfängt und mich beim Connecten/Disconnecten/Empfangen benachrichtigt. Also eigentlich wirklich simples Zeug, was ich bisher aber in keiner Library gesehen hab; aber wie gesagt, vielleicht hab ich boost::asio auch falsch verstanden.


  • Administrator

    Dann schau dir ganz dringend Boost.Asio an. Die Bibliothek ist absolut genial, vor allem wenn du mit den async-Funktionen arbeitest. Du erhälst dadurch automatisch eine Art von Nachrichtenschleife, wo du dann entsprechende Callbacks hast, wenn etwas ausgeführt wurde.
    Boost.Asio hat einige gute Beispiele, die du dir ruhig mal anschauen solltest.

    Desweiteren unterstützt Boost.Asio neu nun mit Boost 1.36 ICMP und Serial-Ports Sockets. Und hat einiges an Performance gewonnen.

    Es ist also wirklich, nur zu empfehlen! Auch wenn der Einstieg etwas komplex ist, wie ich es fand. Aber sobald man den Trick raus hat, ist es extrem einfach und praktisch.

    Grüssli



  • Cool, du scheinst ja wirklich begeistert zu sein, dann werde ich mir asio mal tiefer aneignen! Danke dir 🙂


Anmelden zum Antworten