簡體   English   中英

優雅地取消 boost::asio::async_read

[英]Cancelling boost::asio::async_read gracefully

我有一個看起來像這樣的課程:

class MyConnector : public boost::noncopyable, public boost::enable_shared_from_this<MyConnector>
{
public:
    typedef MyConnector this_type;
    boost::asio::ip::tcp::socket _plainSocket;
    boost::shared_ptr<std::vector<uint8_t>> _readBuffer;

    // lot of obvious stuff removed....

    void readProtocol()
    {
        _readBuffer = boost::make_shared<std::vector<uint8_t>>(12, 0);
        boost::asio::async_read(_plainSocket, boost::asio::buffer(&_readBuffer->at(0), 12),
                boost::bind(&this_type::handleReadProtocol, shared_from_this(), 
                boost::asio::placeholders::bytes_transferred, boost::asio::placeholders::error));
    }

    void handleReadProtocol(size_t bytesRead,const boost::system::error_code& error)
    {
        // handling code removed
    }
};

此類實例通常在嘗試讀取完整消息之前等待接收 12 字節協議。 但是,當我嘗試取消此讀取操作並銷毀對象時,它不會發生。 當我調用 _plainSocket.cancel(ec) 時,它不會使用該 ec 調用 handleReadProtocol。 套接字斷開連接,但未調用處理程序。

boost::system::error_code ec;
_plainSocket.cancel(ec);

並且不釋放使用 shared_from_this() 傳遞的 MyConnector 對象的 shared_ptr。 該對象在堆內存中保持像僵屍一樣。 如何以 MyConnector 對象引用計數遞減的方式取消 async_read(),從而允許對象自行銷毀?

兩件事:一,在handleReadProtocol ,確保如果出現錯誤,則不會調用readProtocol 取消的操作仍然調用處理程序,但設置了錯誤代碼。

其次,如果您完成連接,asio 建議關閉並關閉套接字。 例如:

  asio::post([this] {
     if (_plainSocket.is_open()) {
        asio::error_code ec;
        /* For portable behaviour with respect to graceful closure of a connected socket, call
         * shutdown() before closing the socket. */
        _plainSocket.shutdown(asio::ip::tcp::socket::shutdown_both, ec);
        if (ec) {
           Log(fmt::format("Socket shutdown error {}.", ec.message()));
           ec.clear();
        }
        _plainSocket.close(ec);
        if (ec)
           Log(fmt::format("Socket close error {}.", ec.message()));
     }
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM