2014-02-11 6 views
6

Ich habe versucht, durch Quelle suchen, aber ich kann so viel von einem Vorlagencode nicht navigieren. Grundsätzlich gilt: das ist, was Dokumentation sagt (für close()):Haben Boost Asio-Sockets richtige RAII Cleanup

Remarks  
For portable behaviour with respect to graceful 
closure of a connected socket, call shutdown() before closing the socket. 

ich manuell das tun kann, aber wenn möglich, wäre es schön, auf RAII zu verlassen.

Also, wenn ich Socket außerhalb des Geltungsbereichs habe muss ich shutdown() und close() darauf anrufen, oder es wird automatisch geschehen?

+1

Warum wickeln Sie den Socket nicht einfach in eine Klasse, die im dtor close/shutdown aufruft? – Lother

+0

Ein einfacher Wrapper (ähnlich wie die üblichen Lock-Guard-Implementierungen etc. pp.) Würde tun? Aus Ihrer Quelle scheint es für mich, dass sie dies nicht automatisch bei der Zerstörung der Steckdose tun. –

+0

@Luther gleiche Idee zur gleichen Zeit;), sieht aus wie eine Lösung zu sein ... –

Antwort

4

Man kann sich darauf verlassen, dass der Sockel eine ordnungsgemäße Reinigung mit RAII durchführt.

Wenn ein IO-Objekt, wie beispielsweise Steckdose, zerstört wird, wird seine destructordestroy() auf dem IO-Dienstes Objekt aufrufen, in einer Instanz der implementation_type vorbei, an dem der Dienst des IO-Objekt ausgeführt werden können. Die SocketService Anforderungen besagt, dass destroy() implizit asynchrone Vorgänge as-if durch den Aufruf der close() auf den Dienst, der eine Nachbedingung hat, dass is_open() false zurückgibt, abbrechen. Darüber hinaus führt der Dienst close() dazu, dass ausstehende asynchrone Vorgänge so schnell wie möglich abgeschlossen werden. Handler für abgebrochene Operationen erhalten den Fehlercode boost::asio::error::operation_aborted und werden für einen verzögerten Aufruf innerhalb der io_service eingeplant. Diese Handler werden aus io_service entfernt, wenn sie entweder von einem Thread aufgerufen werden, der die Ereignisschleife verarbeitet, oder io_service ist destroyed.

+1

ich werde 2 Stunden brauchen, um das A zu verstehen, aber scheint legit ... :) – NoSenseEtAl

+0

also das bedeutet, wenn zwei Sockets teilen io_service eine außerhalb des Geltungsbereichs wird sich auf andere auswirken? – NoSenseEtAl

+1

@NoSenseEtAl Nein. Der 'io_service' des IO-Objekts, zurückgegeben von [get_io_service() '] (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_socket/get_io_service .html) unterscheidet sich vom Service des IO-Objekts, der von [get_service() '] zurückgegeben wurde (http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_socket/get_service/overload1 .html). Während Sockets beide denselben 'io_service' verwenden können, hat jeder Socket seinen eigenen' SocketService'. –