簡體   English   中英

boost :: asio :: tcp :: socket關閉並取消,不調用處理程序

[英]boost::asio::tcp::socket Close and cancel without handlers being called

我正在用boost的asio庫編寫一個服務器。 服務器使用一組Connection對象(boost :: asio :: tcp :: socket周圍的包裝類)處理許多並發連接。 在Connection類中,不斷地使用socket.async_read_some(...)讀取套接字,並且每當使用新數據調用讀取處理程序時,立即再次調用socket.async_read_some()以讀取更多數據。

現在,服務器可能由於某種原因決定斷開客戶端,因此自然要做的就是調用connection.close(),然后調用socket.close(),這將導致所有掛起的異步操作被取消。 這會導致使用boost :: asio :: error :: operation_aborted調用讀處理程序(綁定到類Connection中的方法)。 而我的問題是:我不希望這種情況發生。

在socket.close()之后,我想銷毀套接字和連接,然后從服務器的活動客戶端列表中刪除它的指針。 但是,在io_service.run()的下一次迭代之前不會調用讀取處理程序,這意味着我無法立即銷毀我已經傳遞給socket.async_read_some()的套接字或讀取處理程序,直到調用處理程序與錯誤。 所以我不得不以某種方式推遲對這些物體的破壞; 這太煩人了。

是否有安全的方法

  • 取消掛起的異步操作, 不需要調用任何處理程序,所以我可以在socket.close()之后立即安全地銷毀套接字,或者
  • 安全地知道什么時候不能再調用處理程序

還是我完全以錯誤的方式接近這個?

當async.operation完成時 - 無論是成功還是出錯 - 都會調用其完成處理程序。 這是重要的保證,我認為嘗試“破解”這種行為並不是一個好主意。 您在用例中遇到的問題通常是通過使用shared_ptr(shared_from_this idiom)來解決的:將shared_ptr<Connection>綁定到處理程序,當您獲得operation_aborted(或其他一些錯誤)時不要發出另一個async_read,這樣當所有處理程序完成Connection對象被其套接字銷毀。

暫無
暫無

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

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