C++/Sockets: mehrere Schnittstellen mit unterschiedlichen messages



  • Hallo,

    ich habe eine Socket-Verbindung zwischen einem Server und einem Client erzeugt. Wenn der Client zu dem Server verbindet, soll der Server bestimmte Daten zu dem Client senden. Die Socket-Verbindung wird dann geschlossen. Dann rechnet der Client einige Minuten auf den Daten herum, bzw. manipuliert diese. Ist die Berechnung beendet, soll er die Socket-Verbindung wieder öffnen und seine Ergebnisse an den Server übermitteln, der diese zentral speichert.

    Wie kann ich dieses Problem am besten angehen? Der Server muss ja wissen, ob er was schicken soll, oder der Client dem Server etwas "rein reicht"...
    Ich habe fast den ganzen Tag damit verbracht mich damit auseinander zu setzen und mittlerweile raucht mir echt der Kopf.

    Ich habe versucht, bei dem Server unterschiedliche Handler als Funktionen zu implementieren, die einmal ein send() bzw. ein recv() umsetzen, aber irgendwie kommt nirgendwo was an...

    An was ich noch tüftle, ist die Frage, ob ich den Server Berechnungen durchführen lassen kann, während er auf Anfragen von Clients wartet. Wenn ich die Sockets per fork() starte, kann dann der Kindprozess auf die Daten des Vaters zugreifen und diese verschicken, oder sind diese eventuell nicht mehr aktuell, da sie eine Kopie sind?

    Gute Tutorials dazu habe ich leider auch nicht gefunden. Fast alles dreht sich lediglich darum, eine Verbindung zu erzeugen.

    Bitte um mögliche Ansätze

    Danke und Gruß,
    cpp-neuling



  • Hey Ya

    Also, was den fork() angeht, so ist es so, dass separate Prozesse stets auch separate Adressräume haben. Bei einem fork() wird nicht etwa shared memory angelegt, sondern der Addressrauminhalt des Vaters wird in den des Kindes kopiert. Somit haben beide je eine separate Kopie und Änderungen des einen können vom anderen nicht gesehen werden. Um das zu erreichen, müsstest du Threads einsetzen (z.B. POSIX Threads https://computing.llnl.gov/tutorials/pthreads/).

    Was deinen Service angeht, so denke ich, dass du mehrere Möglichkeiten hast. Anhand deiner kurzen Beschreibung gehe ich davon aus, dass dein Server eigentlich 2 Dienste anbietet:
    - rohe Daten bereitstellen
    - bearbeitete Daten entgegennehmen

    Diese beiden Services könntest du entweder auf Portebene trennen (z.B. Bereitstellung auf Port 30001, Entgegennahme auf Port 30002) oder du implementierst das in deinem Applikationsprotokoll, z.B. ganz banal indem der Client mit dem ersten Zeichen, das er dem Server schickt, angibt ob er rohe Daten abholen oder bearbeitete abgeben will.

    Dabei kannst du dich für die Lösung entscheiden, die dir eleganter scheint.

    Hoffe, das hilft ein wenig, weiteres Kopfrauchen zu verhindern 😉
    greeetz Kessi

    PS: Da du dich selbst cpp-Neuling nennst, möchte ich dich auf eines hinweisen: Diese Linux-Systembefehle sind eigentlich keine richtigen C++ Funktionen, sondern altes C-Geschmäus. Obwohl in vielen Situationen durchaus sinnvoll einsetzbar, bieten diese alten Schnittstellen im Allgemeinen nur wenig Komfort, weshalb man normalerweise modernere Libraries (z.B. die Boost Library http://www.boost.org/) vorzieht.


Log in to reply