Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do boost asio sockets have proper RAII cleanup

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?

like image 793
NoSenseEtAl Avatar asked Feb 11 '14 19:02

NoSenseEtAl


1 Answers

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 the implementation_type on which the IO object's service will operate. The SocketService requirements state that destroy() will implicitly cancel asynchronous operations as-if by calling the close() on the service, which has a post condition that is_open() returns false. Furthermore, the service's close() will cause outstanding asynchronous operations to complete as soon as possible. Handlers for cancelled operations will be passed the error code boost::asio::error::operation_aborted, and scheduled for deferred invocation within the io_service. These handlers are removed from the io_service if they are either invoked from a thread processing the event loop or the io_service is destroyed.

like image 117
Tanner Sansbury Avatar answered Oct 23 '22 17:10

Tanner Sansbury