![](/img/trans.png)
[英]what is different between boost::asio::ip::tcp::socket::cancel and socket::close
[英]Using boost::asio::ip::tcp::socket::cancel() and socket::close()
如果我使用close而不取消,則存在一些問題。
close
函數可以關閉套接字,並通過返回boost::asio::error::operation_aborted
錯誤來停止任何未完成的異步操作。
我為什么要使用cancel
而不是close
?
我擔心如果某些異步操作正在執行, cancel
無法取消它,是嗎?
像asio::ip::tcp::resolve::cancel
,我在調用async_resolve
后嘗試多次取消resolve_handler
,但是resolve_handler
總是返回而沒有boost::asio::error::operation_aborted
錯誤。
我認為resolve_handler
正在執行?
是?
如果要在不關閉套接字的情況下停止掛起操作,則取消非常有用。
請注意, Boost文檔建議使用close以獲得更高的可移植性(來自doc頁面):
...對於便攜式取消,請考慮使用以下備選方案之一:
- 通過定義BOOST_ASIO_DISABLE_IOCP來禁用asio的I / O完成端口后端。
- 使用close()函數同時取消未完成的操作並關閉套接字。
cancel
不會關閉套接字,因此如果您打算繼續使用套接字對象,請使用cancel
。 特別是,如果在異步處理程序方法中有代碼引用套接字的成員函數,則可能不希望在確保當前正在執行的異步處理程序已完成之前關閉套接字。
cancel
不保證當前正在執行的異步處理程序,它只保證(根據boost文檔)“這個函數導致所有未完成的異步連接,發送和接收操作立即完成”在socket::cancel()
的情況下在resolver::cancel()
調用的情況下,調用或“此函數強制完成主機解析器上的任何掛起的異步操作”。 這個“完成”意味着boost將調用你的異步處理程序方法,它沒有權限將任何取消邏輯注入你的異步處理程序(更不用說它不知道處理程序的實現開始)。
我建議將自己的邏輯添加到異步處理程序方法中,以處理socket / resolver / etc的情況。 被取消了。 如果您正在調用cancel方法,那么您可能能夠將此取消傳遞給異步處理程序方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.