Cplusplus: UDP Event bei Empfang
-
Hallo zusammen
Als Neuling hier im Forum bitte ich um ein paar Anregungen zu meiner aktuellen Problemstellung:
Ich versuche grade, eine Client-Server Kommunikation per UDP zu erstellen.
Der Verbindungsaufbau funktioniert soweit gut (nach folgendem Tutorial: http://www.c-worker.ch/tuts/udp.php).
Darauf aufbauend soll einer größeren Anwendung von mehreren Kommunuikationspartnern Input geliefert werden. Dieser Input wird dann in main() und anderen Methoden verarbeitet. Wenn nun währenddessen eine weitere wichtige Nachricht kommt, muss umgehend auf diese reagiert werden.Alle von mir gelesenen Quellen/tutorials/Bücher arbeiten aber mit Endlosschleifen.
Ich würde mich freuen, wenn mir hier ein wenig auf die Sprünge geholfen werden könnte, wie diese Fragestellung anzugehen ist.Vielen Dank vorab!
lg
moon
-
Hallo,
also erstmal ist an deiner Frage kein Bezug zu C++/CLI erkennbar. In dieser Rubrik geht es um die Zusammenarbeit von C++ mit dem .net Framework. Deine Frage und die verlinkte Anleitung haben nichts damit zu tun.
Dein Problem zeigt dir den Unterschied zwischen Programmierung und Softwarearchitektur. Um es mal mit einem Beispiel aus der realen Welt zu sagen: Du hast Anleitungen zum Mauern gelesen, das reicht aber nicht, um ein Haus zu bauen. Du must in deiner Anwendung den Empfang und die Verarbeitung der Daten trennen. Das wird wahrscheinlich nicht ohne Multithreading gehen. Da du schreibst, die Verarbeitung finde in main statt, ist das sicher ein großer Schritt für dich.
Tutorials in dem Bereich kenne ich nicht. Eventuell kommen Vorlesungsskripte in Frage, da weiß ich aber auch nicht, was es frei gibt.
An Büchern fällt mit spontan dies ein
http://www.amazon.de/Pattern-orientierte-Software-Architektur-nebenl%C3%A4ufige-vernetzte-Objekte/dp/3898641422
ist aber sicher zu kompliziert für dich. Dort geht es jedenfalls darum, wie Server effizient auf Anfragen zahlreicher Clients reagieren könnnen. Ein Stichwort wären die Entwurfsmuster Proactor und Reactor, die unter anderem auch hier auftauchen
http://www.cs.wustl.edu/~schmidt/ACE.html
http://pocoproject.org/index.html
ist aber beides sicher ein paar Nummern zu groß für dich.[Edit]
Ach ja, natürlich gibt es noch asio
http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio.html
-
Hallo,
vielen Dank für Deine Antwort!
Zunächst sry, dass ich im falschen Forum gepostet habe. Nachdem ich aus der Anleitung für Einsteiger nicht wirklich schlauer war, hab ich die Forumssuche mit "UDP" bemüht und da gepostet, wo die meisten Treffer waren
Vielleicht könnte jemand den Thread verschieben?Das klingt in der Tat recht aufwändig, ich hatte gehofft es gibt ein einfaches Schlagwort wie "OnMessageJump/Do xyz"
Dann werde ich für den Anfang wohl beim Pollen bleiben müssen.Danke & lg
moon
-
moon12 schrieb:
Vielleicht könnte jemand den Thread verschieben?
Na dann warten wir mal auf einen Moderator. Nur sollten wir vielleicht mal klären, ob du da C (nur Funktionen) oder C++ (mit Objekten) programmierst.
moon12 schrieb:
Das klingt in der Tat recht aufwändig, ich hatte gehofft es gibt ein einfaches
In der Sprache selbst nicht, in Bibliotheken, wie den genannten, eventuell schon. In soweit bist du hier nicht ganz falsch, auch das .net Frameworke hat da Möglichkeiten, aber da würde man eher C# nehmen. C++/CLI ist nur Kleber zwischen C++ und C#.
Ganz allgemein gibt es halt sehr viele Möglichkeiten, so etwas aufzubauen. Stell dir einen Schnellimbiß vor. Im Moment hast du die einfachste Variante, ein Wurstverkäufer wartet auf Kunden. Kommt einer und bestellt eine Wurst, brät der Verkäufer sie, gibt sie, wenn sie fertig ist, dem Kunden und nimmt erst dann den nächsten dran.
Asynchrone Programmierung wäre, der Verkäufer legt die Wurst auf den Grill und nimmt in der Zwischenzeit weitere Kunden an. Er muss dann mit mehren unterbrochenen Aufträgen klar kommen.
Dann könnte man einen Imbiß mit mehreren Verkäufern bauen.
Oder man wählt den Aufbau einer Burgerbraterei. Einer steht an der Theke, einer in der Küche. Das kann man dann durch den Ausbau der Theke und der Küche hochskalieren.
Ich hoffe, das erklärt, warum man dazu dicke Bücher schreiben kann.
Schau dir die Http-Server Beispiel von Asio an, da werden verschiedene Möglichkeiten gezeigt. Aber in modernem C++, eventuell bist du noch nicht so weit.
-
Da ich nun ein Lösung gefunden habe, möchte ich diese auch anderen kurz zugänglich machen:
der Funktion select() kann man mehrere Sockets übergeben. Ist ein Socket lesebereit, wird dieser zurückgegeben um mit read() weiter behandelt werden zu können.
Zusätzlich gibt es die Möglichkeit, select() einen timeout-wert zu übergeben. Wird dieser Wert überschritten, ohne dass eine Nachricht empfangen wurde, wird select() verlassen.Danke für Eure Hilfe!
PS: Ja der Thread ist definitiv im falschen Forum gepostet, sry
lg
moon