Abbruch des blocking calls accept() vom acceptor ( Boost.Asio )



  • Hallo da draußen,

    Obwohl ich in der Vergangenheit schon Ergebnisse mit der WinApi erziehlt habe, wollte ich jetzt eigentlich so weit wie möglich Boost bevorzugen.

    Nun treffe ich wieder auf dasselbe Problem, auf das laut meiner Suche im Internet schon viele getroffen sind: Wie kann ich ein empfangendes Objekt (in diesem Fall ja der acceptor) schließen während der accept-call noch blockt?
    Nun, auf native Möglichkeiten will ich nach Möglichkeit verzichten, also dachte ich mir, ich könnte den acceptor in den non_blocking Modus versetzen. Das klappte auch vorrübergehend, bis mir in einem Test auffiehl, dass nun für einige Test-Clients keine Verbindung mehr entsteht: Der Client war ebenfalls im non_blocking Modus, und beide Anwendungen haben sich so ständig "verpasst", da keine auf die Bereitschaft der anderen wartete.
    Nun könnte ich nur Clients im blocking Modus verwenden, was ich aber lieber umgehen möchte, da ich Kompatiblität für beide Möglichkeiten bieten will.
    Ich habe mir also überlegt, dass ich mir den lokalen endpoint des acceptors über seine Methode local_endpoint schnappen kann, und mit einem Socket in einem anderen Thread einfach eine Verbindung aufbauen kann, was den accept erfolgreich beendet. Wenn der Thread des acceptors nach jedem accept auf einen angeforderten interrupt prüft, kann der Thread des acceptors jederzeit ohne Hilfe von außen beendet werden.

    An dieser Stelle meine Frage:
    -Ist es überhaupt in ordnung/portabel mithilfe des acceptor::local_endpoint() eine TCP-Verbindung zum eigenen acceptor aufzubauen? Ich habe bisher nichts gefunden, was dagegen spricht, aber überall wird ständig nur geraten, den Empfänger-Thread gegen Programmende (exit aus main()) einfach nur verdursten zu lassen, was ich doch nicht so ganz schick finde.



  • Irgendwie habe ich boost asio anders in Erinnerung.. nutzt man da nicht die asnychronen Funktionen und ruft dann io_service.run() mit x Threads oder so auf?



  • cooky451 schrieb:

    Irgendwie habe ich boost asio anders in Erinnerung.. nutzt man da nicht die asnychronen Funktionen und ruft dann io_service.run() mit x Threads oder so auf?

    Genau das. Asynchrone Operationen sind abbrechbar und damit offenbar genau das, was du brauchst.



  • Nanu, die asynchronen Operationen von Boost sind in meinem Sinne abbrechbar? Dann bezieht sich "causes all outstanding asynchronous connect, send and receive operations to finish immediately" aus der Dokumentation von cancel wohl auch auf aktuell laufende Operationen, das ging mir aus der Formulierung nicht ganz so klar hervor, besonders da die Doku vom acceptor darauf hinweist, dass shared objects nicht threadsafe sind. Aber OK, da wird wohl intern irgendwo hinreichend Synchronisation ablaufen.

    Das neue Konzept ist jetzt zwar ein wenig komplizierter, aber der Hinweis war sehr hilfreich, danke sehr.



  • Hier ist boost::asio ziemlich gut beschrieben: www.highscore.de


Anmelden zum Antworten