I tried looking through source but I cant navigate that much of a template code.
Basically: this is what documentation says (for close()
):
Remarks For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.
I can do that manually, but if possible it would be nice to rely on RAII.
So if I have socket going out of scope do I need to call shutdown()
and close()
on it, or it will be done automatically?
One can rely on the socket performing proper cleanup with RAII.
When an IO object, such as socket, is destroyed, its destructor will invoke
destroy()
on the IO object's service, passing in an instance of theimplementation_type
on which the IO object's service will operate. TheSocketService
requirements state thatdestroy()
will implicitly cancel asynchronous operations as-if by calling theclose()
on the service, which has a post condition thatis_open()
returns false. Furthermore, the service'sclose()
will cause outstanding asynchronous operations to complete as soon as possible. Handlers for cancelled operations will be passed the error codeboost::asio::error::operation_aborted
, and scheduled for deferred invocation within theio_service
. These handlers are removed from theio_service
if they are either invoked from a thread processing the event loop or theio_service
is destroyed.