C++ Boost::asio mehrere Verbindungen von einem endpoint

daemon777

Lt. Commander
Registriert
Dez. 2003
Beiträge
1.371
Hallo Leute,

nachdem mir die Multithreadingsachen unter boost echt Spaß gemacht haben (so einfach war es einfach noch nie) habe ich mir gedacht: hey bevor du wieder die ganzen w32_socket-Geschichten auspackst nimm doch einfach auch hier boost. Allerdings kann ich mich hier noch nicht so ganz mit anfreunden und frage mich ob es nicht einfacher ist doch wieder zurück zu den alten win-Sockets zu gehen.

Mein Problem ist folgendes:
eigentlich möchte ich im Moment nur einen Server erstellen, der eine gewisse Anzahl an Verbindungen annehmen und anschließend verwalten kann. Die Beispiele von der Seite sind ja schön und gut aber irgendwie wird in den Beispielen auch immer eine Vielzahl von Objekten angelegt (entweder io_services oder sockets oder was weiß ich). Deshalb sehe ich hier im Moment nicht so ganz den Sinn der Asio-Bibliothek.
Also habe ich mal n Threads erstellt und jeder wartet auf eine Verbindung, schickt anschließend ein paar Datan raus und schließt wieder. Das erwartete Verhalten wäre, dass beim Öffnen von 2 Clients beide Nachrichten bekommen. Aber genau das passiert eben nicht. Der Erste bekommt alle Nachrichten und der Zweite bekommt gar keine. Lustigerweise werden aber alle geöffneten Clients ebenfalls mit dem Ersten beendet. Es wird also schon eine Verbindung aufgebaut.
Man sollte vielleicht hinzu sagen, dass ich alle Clients auf einem Rechner laufen lasse, was zum Testen auch anders einfach gar nicht sinnvoll ist. Meine Vermutung ist jetzt, dass mir genau das eben Probleme bereitet.
Weiß jemand, ob das ein grundsätzliches Problem ist und/oder wie man so etwas angehen kann? Im Moment greife ich irgendwie nach Strohhalmen und das Reinarbeiten in eine Bibliothek macht auch nur so lange Spaß, wie eben alles funktioniert :D

Ob asynchron oder nicht ist mir übrigens ziemlich egal. Wenn mir boost die Verwaltung abnimmt ist schön und wenn ich es selber machen muss ist das jetzt ja auch nicht unbedingt die größte Arbeit.

Wäre cool wenn hier schon jemand ein solches Problem hatte oder eine Ahnung hat was ich ausprobieren kann.

viele Grüße
daemon777
 
Hi,

ohne jetzt direkt auf asio einzugehen; eigentlich erstellt man im Server ja einen Listener-Socket, der Verbindungen annimmt, und die weitere Kommunikation läuft dann parallel über eigene Sockets ab.

Also habe ich mal n Threads erstellt und jeder wartet auf eine Verbindung

Arbeitest Du immer auf demselben (Server)Socket-Objekt? Wenn ja, dann kann dieser Socket auch nur mit einem Client gleichzeitig kommunizieren, während die restlichen Clients in der Warteschlange stehen. Schließt Du die Verbindung, dann haben die anderen keine Chance mehr, noch Daten zu empfangen.

Ich würde mal suchen, ob der Server-Socket eine Art "accept"-Aufruf anbietet (ähnlich wie bei den Win32 Sockets).

ob es nicht einfacher ist doch wieder zurück zu den alten win-Sockets zu gehen

Würde ich nicht machen. Sehr portabel ist die Win32 API nicht ;)

Gruß L8N
 
Zuletzt bearbeitet:
Zurück
Oben