删除套接字时处理程序会发生什么

时间:2013-01-28 10:22:49

标签: c++ boost-asio

当套接字关闭/关闭然后删除(即运行析构函数并释放内存)时,完成处理程序会发生什么? SFA之后关闭所有完成处理程序的AFAIK将在下次循环轮询时收到错误代码。但是如果在处理程序有机会运行之前删除了socked会发生什么?在调度事件处理程序之前删除套接字是否可以?

2 个答案:

答案 0 :(得分:2)

在执行未完成的处理程序之前删除套接字是安全的。未完成的操作将设置为使用boost::asio::error::operation_aborted调用其处理程序。应用程序代码负责确保处理程序不会在已删除的套接字上调用操作。

有关详细信息,destroying IO对象(如套接字)将导致IO对象的服务被破坏。 SocketService要求声明destroy()将隐式取消异步操作。出色的异步操作将尽快完成。这会导致取消操作的处理程序传递错误代码boost::asio::error::operation_aborted,并在io_service内调度延迟调用。如果从处理事件循环的线程调用这些处理程序,或io_servicedestroyed,则会从io_service中删除这些处理程序。

答案 1 :(得分:1)

保证所有处理程序都被调用。如果socket被关闭 - 将使用一些错误代码调用处理程序。

通常,您需要使用此保证来使用boost :: enable_shared_from_this来控制对象的生命周期。

class Writer : boost::enable_shared_from_this<Writer>
{  
  boost::asio::socket scoket_;

  ...

  void StartWrite() 
  {
      boost::asio::async_write(socket_,
          boost::asio::buffer(buffer_, bytes_sent_),
          boost::bind(&Writer::Handler, shared_from_this,
              boost::asio::placeholders::error));
  ...
  void Handler(boost::system::error_code const& err) {...}

使用这种方法,您的套接字对象将比所有待处理的处理程序更长。