C++: Applikation mit Client Socket und einem Server Socket

TuxuT

Ensign
Registriert
Sep. 2011
Beiträge
251
Hallo Gemeinde.

Ich finde derzeit unzählige Beispiele für einen einfachen Aufbau einer Client-Server-Verbindung in C++... Dabei wird oft eine Client-App erzeugt und ein weiteres Executable für den Server. Ist ja auch okay...
Mein Ziel ist derzeit aber EINE Applikation (EXE) zu schreiben, die einen Client-Anteil und einen Server-Anteil beinhaltet.

Der Client wartet dabei zunächst auf einen externen Server und baut eine Verbindung zu diesem auf, sobald der Server sich meldet (auf Port A).
Im weiteren Verlauf würde die Applikation nun selbst einen Server anbieten für einen weiteren Client im Netzwerk (Auf Port B).
Habt ihr einen Tipp, wie dies zu realisieren ist? In einer einfachen main-Routine ist dies vermutlich nicht mehr händelbar bzw. ich müsste Threads einführen, damit ich "gleichzeitig" den Client-Port und Server-Port abfrühstücken kann...?


Herzlichen Dank bis hierhin!
 
Nutzt du reines C++ oder ein Framework wie Qt?
 
Das müsste schon eine reine C++ - Applikation werden...
Und leicht portierbar (Windows <-> Linux).
(Evtl. schwenke ich später mal auf Boost um, aber das ist momentan nicht geplant.)
 
Das müsste schon eine reine C++ - Applikation werden...
Und leicht portierbar (Windows <-> Linux).
(Evtl. schwenke ich später mal auf Boost um, aber das ist momentan nicht geplant.)
Auch wenn ich persönlich solche Grundsatzdiskussionen als Antwort und infrage stellen der Frage nicht mag muss ich es hier doch tun:
Wieso willst du dir das antun? Das macht aus technischer Sicht überhaupt gar keinen Sinn und dient auch nicht wirklich dem Lernzweck.

Mit nur einer programmierten Variante plattform unabhängig OHNE externe Lib wie QT/Boost ist unmöglich da sowohl unter Windows als auch unter Linux TCP/IP nicht genutzt werden kann ohne Betriebssystem-spezifische Header zu inkludieren. Dh im Endeffekt würdest du genau das machen müssen, was mehr oder weniger so schon in Boost bzw QT realisiert wurde. Du würdest den Client/Server Teil solcher Libs also nochmal neu erfinden. Hierzu wirst du einige male Code der Art:
#ifdef WINDOWS
// Windows-Implementation
#else
// Linux-Implementation
#endif
schreiben.
Willst du das wirklich? Selbst wenns dir ums lernen geht: Wieso liest du dann nicht den Code dieser beiden sehr guten open source Bibliotheken?

Ich persönlich würde QT empfehlen auch wenn du keine GUI brauchst aber das ist Geschmackssache. Die Mehrheit würde wahrscheinlich boost verwenden.
 
Unter Linux gibst den select bzw. poll Befehl, mit dem man gleichzeitig auf mehrere Sockets warten kann - ob das jetzt besser order schlechter als die Nutzung mehrerer separater threads ist sei mal dahingestellt.

Ein standard c++ Lösung für Netzwerkkommunikation gibts leider nach wie vor nicht, aber Boost ASIO (gibts auch als separate Bibliothek) kommt dem am nächsten (jedefalls deutlich näher als die Linux oder Windows Netzwerk API).
 
Wenn Du C-Libraries magst, dann schau dir gerne mal die libuv an. Das ist eine schlanke C-Library, die auch bei nodejs zum Einsatz kommt und grob gesagt dir eine "Grundstruktur" für die Architektur deiner Software zur Verfügung stellt. So ganz ohne Stützräder würde ich in diesem Bereich einfach nicht arbeiten, denn "nur" mit einer Implementierung der WinSocks2/BSD-Sockets ist es ja nicht getan. Du brauchst noch eine Event-Loop, Thread-Pools, … und das ganze am besten asynchron.

Schöne Network-Examples gibt es hier.
 
Zurück
Oben