Client/Server Kommunikation Realisierung



  • Hallo Leute,

    ich muss eine Client- und eine Serveranwendung bauen, welche über das Netz kommunizieren können.

    Der Client muss dabei Befehle und Daten (z.B. Binärdateien) vom Server erhalten können.
    Es ist möglich dass der Client den Server einfach jede Minute einmal anspricht und nach neuen Daten fragt etc.

    Wie realisiere ich das am besten?

    Bisher wollte ich einfach "Daten" via Sockets übertragen. Die Daten können ja ein bestimmtes Format haben.

    Aber dieser Ansatz ist irgendwie sehr fehleranfällig. Typisches RPC ist eher schlecht, weil nicht so viele Ports freigegeben werden dürfen. Eine andere Möglichkeit wäre einen Webservice zu bauen (WSDL), aber ist das wirklich einfacher als die Lösung mit Sockets?

    Vielleicht gibt es noch eine bessere Möglichkeit. Leider bin ich gerade etwas ratlos wie man so eine Kommunikation am Besten realisiert.

    Client und Server sind beide in C++ (kein .NET).

    Danke und Gruß



  • sockets sind genau das, was du brauchst. Abhängig von deinem OS bringt die Compiler Suite wahrscheinlich schon was mit, wenn du plattformunabhängig sein willst guck dir boost::asio an.



  • c++_frager schrieb:

    Bisher wollte ich einfach "Daten" via Sockets übertragen. Die Daten können ja ein bestimmtes Format haben.

    Aber dieser Ansatz ist irgendwie sehr fehleranfällig.

    Was soll daran fehleranfällig sein?



  • Suchst du vielleicht eine asynchrone Verbindung?



  • Bisher wollte ich einfach "Daten" via Sockets übertragen.

    Sockets übertragen nur ByteStröme(TCP) / ByteHäppchen(UDP) ...
    DU musst also noch nen höheres Protokoll druebersetzen.

    Ob du da schon was vorgefertigtes nimmst (webservises z.b.) oder selbst ein eigenes Kommunikations-Protokoll drüberlegst, ist alles dein Problem.

    Bei Kommunkation zwischen teilnehmern auf unterschiedlichen Plattformen nimmt man oft Text (ASCII) - Zeilenorientierte protokolle

    Beispiele wie man sowas definiert kannst in den RFC's zu smptp, ftp, http, telnet ... finden. Und auch z.b. , wie man binaer-daten ueber ein ASCII basierendes protokoll drüberbekommt (Base64/radix)

    Alternativ, wenn deine Plattform immer gleich aufgebaut ist (8bit = 1byte) kannst binaerprotokolle fahren (Little/Big-Endian sollte dein Protokollstack dann rauscodieren)
    Beispiel fuer sowas ist z.b. nfs,samba,Medien-Streams aller Art

    Was das beste fuer Dich ist .... musst du entscheiden.
    Fehlerhaft darf es natuerlich nicht sein. Der Aufwand um das so fehlersicher wir möglich zu machen,sollt natürlich in die Wahl des Protokolls mit eingehen ...

    Ciao ...



  • Erstmal Danke für eure Antworten!

    @DocShoe: Danke ich werde es nun direkt mit Sockets (TCP) machen

    @Belli: Ich habe schon oft gelesen das diese selbst gestrickten Nachrichten sehr fehleranfällig sind - insbesondere weil eine feste Schnittstellendefinition fehlt.
    Daher mein Zweifel an dieser Lösung.

    @RHBaum: Danke ich werde mir das mal ansehen.

    Wegen dem Protokoll hatte ich auch noch eine andere Idee. Ich würde das gerne in einer Klasse kapseln. Diese enthält dann Typ der Nachricht, Nutzlast, etc.
    Und dann würde ich ein simples Request/Response Protokoll bauen.
    Ich frage mich nur wie ich eine Klasse über Sockets übertragen kann. Gibt es da einen guten Weg zur Serialisierung der Daten in der Klasse?
    Ist es eine gute Idee eine Klasse als Nachrichtenstruktur/Protokoll zu verwenden?

    Danke nochmal, Gruß



  • Guck Dir doch mal Boost.Serialization (http://www.boost.org/doc/libs/1_46_1/libs/serialization/doc/index.html) oder Google Protocol Buffer (http://code.google.com/p/protobuf/) an.


Anmelden zum Antworten