2014-09-03 25 views
1

我打電話ASIO :: ASYNC_WRITE這樣:現在我是否需要在調用async_write時關心套接字的生命週期?

namespace asio = boost::asio; 
using asio::ip::tcp; 
using std::string; 

shared_pointer<tcp::socket> tcp_socket_pointer; 
string message; 

... 

void send() { 
    asio::async_write(
     *tcp_socket_pointer, 
     asio::buffer(message), 
     boost::bind(
      &handle_send, // defined elsewhere 
      asio::placeholders::error, 
      asio::placeholders::bytes_transferred) 
    ); 
} 

,在我的代碼有可能是電話sendhandle_send之間我通過插座被銷燬,因爲tcp_socket_pointer超出它的範圍。

合法嗎?我的意思是,我是否需要確保引用的tcp :: socket持續存在,直到異步操作完成? 我的直覺告訴我,asio :: async_write立即進行系統調用,所以我不需要擔心,但我最好問:)。

如果它不能按我期望的那樣工作,將tcp_socket_pointer作爲參數傳遞給handle_send以確保它指向的tcp :: socket不會過期是個好主意嗎?

回答

4

您可以使用此功能,但當tcp::socket銷燬時async_*呼叫將被取消。

您可能希望保留shared_ptr到套接字並將其綁定到完成處理程序,以便它保持引用,這實際上是您描述的內容。

+0

它會取消,但不會拋出運行時錯誤?這將是我想要的行爲:))。順便說一句,如何可以提高檢查套接字是否被破壞了一個普通的參考? – kitek 2014-09-03 17:21:16

+1

@kitek它不能。在對象上調用析構函數時,它會在同一個對象上執行取消操作。如果你想查找一個套接字是否在不保存(共享)引用的情況下被銷燬,請使用'boost :: weak_ptr'(或'std :: weak_ptr') – sehe 2014-09-03 17:23:37

+0

這就是困擾我的原因,因爲'async_write'是一個通用函數在while循環中工作直到寫入所有內容。因此,我擔心這個代碼可能會中斷。 – kitek 2014-09-03 17:34:05

相關問題