2010-12-09 7 views
4

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

2

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.

+0

Ich würde es vorziehen, keine intelligenten Zeiger zu verwenden, da rohe Zeiger für mich eher nativ sind. – vladimir

+5

@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

+1 für die Verwendung von "ballache" in einem Satz. –

1

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.

+0

sicherlich ergibt es nur eine RST, wenn Sie die Verweildauer explizit ausschalten ... –