2015-11-26 45 views
2

我有下面的類定義:升壓:ASIO :: ASYNC_WRITE:數據發送,但處理不叫

// SocketTypeT may be e.g. 'boost::asio::ip::tcp::socket' 
template<class SocketTypeT> 
class Socket : public SocketTypeT, public boost::enable_shared_from_this< Socket<SocketTypeT> > { 
[...] 

在這一類,我有以下方法 'writeAsync':

void writeAsync(const std::string& strData) {    
      boost::asio::async_write(*this, boost::asio::buffer(strData),         
            boost::bind(&Socket::handle_write_async, 
            shared_from_this(), 
            boost::asio::placeholders::error, 
            boost::asio::placeholders::bytes_transferred)); 
} 

而且最後在 'writeAsync' 所使用的處理程序(也是一類的成員函數):

void handle_write_async(const boost::system::error_code& ec, std::size_t cntBytesSent) { 
    cout << "handle_write_async" << endl; 
    if (m_pSocketAsyncObserver) { 
     m_pSocketAsyncObserver->handleAsyncWrite(connectionClosed, cntBytesSent, ec); 
    } 
} 

Proble m:

數據已成功傳輸到服務器,但'handle_write_async'從未被調用過。這可能是什麼原因?

+0

該代碼表面看起來不錯 - 你在'io_service'上調用'run()'嗎? – Nim

+0

調用run()失蹤。但即使調用運行,結果也是一樣的。呼叫順序是否有關,例如在使用'io_service'對象初始化'boost :: asio :: ip :: tcp :: socket'之前,我必須調用run嗎? – Anonymous

+0

'io_service :: run()'是派遣所有異步操作所必需的。通常你可以設置所有東西(套接字,連接等),然後調用運行(因爲它是一個阻塞操作 - 除非你在另一個線程中執行)。 – Nim

回答

0

對於連續執行run您需要提供io_service::work對象。請閱讀this question

相關問題