是否对提升 asio 插槽进行适当的 RAII 清理

Do boost asio sockets have proper RAII cleanup

本文关键字:RAII 清理 asio 插槽 是否      更新时间:2023-10-16

我尝试查看源代码,但我无法浏览那么多模板代码。基本上:这是文档所说的(对于close()):

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

我可以手动执行此操作,但如果可能的话,依靠 RAII 会很好。

因此,如果我的套接字超出范围,我是否需要调用shutdown()close(),或者它将自动完成?

可以依靠套接字使用 RAII 执行正确的清理。

当 IO 对象(如套接字)被销毁时,其析构函数将在 IO 对象的服务上调用destroy(),传入 IO 对象的服务将在其上运行的implementation_type的实例。 SocketService要求指出,destroy()将通过调用服务上的close()隐式取消异步操作,该服务具有is_open()返回 false 的后置条件。 此外,该服务的close()将导致未完成的异步操作尽快完成。 已取消操作的处理程序将被传递错误代码boost::asio::error::operation_aborted,并计划在io_service内延迟调用。 如果从处理事件循环的线程调用这些处理程序或销毁io_service,则会从io_service中删除这些处理程序。