我尝试查看源码,但我无法浏览大量的模板代码。
基本上:这就是文档所说的(对于close()
):
Remarks For portable behaviour with respect to graceful closure of a connected socket, call shutdown() before closing the socket.
我可以手动完成,但如果可能的话,依靠RAII会很好。
因此,如果我的套接字超出范围,我是否需要在其上调用shutdown()
和close()
,否则它将自动完成?
答案 0 :(得分:4)
可以依赖套接字使用RAII进行适当的清理。
当一个IO对象(如socket)被销毁时,它的destructor将在IO对象的服务上调用destroy()
,传入IO对象所在的implementation_type
实例服务将运作。 SocketService
要求声明destroy()
将通过调用服务上的close()
隐式取消异步操作 as-if ,该服务的后置条件为{{1返回false。此外,服务的is_open()
将导致未完成的异步操作尽快完成。取消操作的处理程序将传递错误代码close()
,并计划在boost::asio::error::operation_aborted
内进行延迟调用。如果从处理事件循环的线程调用这些处理程序,或io_service
为destroyed,则会从io_service
中删除这些处理程序。