Ich verwende Boost asynchrone Sockets für meine Server-Anwendung. Ich habe eine disconnect() - Funktion erstellt, die boosts close() aufruft und dann den Socket löscht (operator delete). Und es ist in Ordnung, wenn die Funktion von einem der Async aufgerufen wird. Handler, aber wenn ich es von innerhalb meiner Hauptcodebasis aus anrufe, stürzt die gesamte Anwendung bei einem der asynchronen Handler ab. Wie man eine Steckdose in Boost schön zu schließen?Boost :: asio Sockets - wie trennen Sie sie sauber?
Antwort
Stellen Sie sicher, dass das Objekt am Leben ist, solange es Handler gibt, die es verwenden können.
Es ist wahrscheinlich, was man von Behandlungsroutinen, die diese Buchse verwendet wird aufgerufen, nachdem Sie in der Nähe nennen (wie es die Fehler-Handler-Berichte) und greifen dann auf tote Zeiger ...
Normalerweise Lebensdauer Handhabung kann leicht gemacht werden mit boost::shared_ptr
und boost::enable_shared_from_this
und Übergabe in Handler. Siehe zahlreiche Beispiele, die mit Boost.Asio bereitgestellt wurden.
Sobald Sie sich mit dieser Technik vertraut gemacht haben, wäre die von Ihnen gestellte Frage für Sie trivial.
Sie möchten auch die Shutdown-Methode auf einem Socket untersuchen. Es wird Ihre abstürzende Anwendung nicht lösen. Artyom oben erklärte bereits die Ursache dafür, aber es ist trotzdem interessant. Wenn Sie einen Socket schließen, ohne Herunterfahren aufzurufen, kann dies dazu führen, dass eine RST gesendet wird, anstelle eines fehlerfreien FIN-Handshakes.
sicherlich ergibt es nur eine RST, wenn Sie die Verweildauer explizit ausschalten ... –
- 1. Boost Asio und Web Sockets?
- 2. AF_NETLINK (netlink) Sockets mit boost :: asio
- 3. Haben Boost Asio-Sockets richtige RAII Cleanup
- 4. So trennen Sie FireBase-Sockets?
- 5. Unterstützt boost :: asio Websockets?
- 6. C++: Boost :: Asio: write() unterstützt keine UDP-Sockets?
- 7. boost :: asio :: io_service wirft Ausnahme
- 8. Wie trennen Sie sauber Code für Rückwärtskompatibilität vom Hauptcode?
- 9. Interrupt boost :: asio synchronen Lese?
- 10. Wer nutzt Boost ASIO?
- 11. Boost Asio single-threaded Leistung
- 12. boost :: asio, asynchroner Lesefehler
- 13. Speicherverluste in Boost Asio
- 14. boost :: Asio Lese-/Schreiboperationen
- 15. Boost Asio und Endian
- 16. boost :: asio Multicast Beispiel
- 17. Lochung mit boost :: asio
- 18. Gestoppte Thread-Server-Schleife mit Boost :: Asio
- 19. Was macht boost :: asio :: spawn?
- 20. Clients mit boost asio unterscheiden
- 21. ändern Sie die DCB-Struktur eines boost :: asio :: serial_port
- 22. Benötigen Sie eine Erklärung für diesen Boost :: asio timer example
- 23. Bessere Boost Asio deadline_timer Beispiel
- 24. Wie Boost verwenden Asio mit Klirren/c2
- 25. Wie verbinde ich einen boost :: socket nach einem Verbindungsabbruch sauber?
- 26. boost :: asio und Active Object
- 27. SSL-Zertifikate und Boost asio
- 28. Boost :: Asio: io_service.run() vs Umfrage() oder wie integriere ich boost :: asio in Mainloop
- 29. Makefile für Boost-Sockets
- 30. boost :: asio und rekursive Serveraufrufe
Ich würde es vorziehen, keine intelligenten Zeiger zu verwenden, da rohe Zeiger für mich eher nativ sind. – vladimir
@vladimir, nur weil du das Gefühl hast, etwas ist nativer, macht es keine gute Übung. Intelligente Zeiger lösen viele Probleme, die sonst eine Ballache sein können :) –
+1 für die Verwendung von "ballache" in einem Satz. –