2010-01-22 117 views
2

我很新的提升。我需要一個跨平臺的低級C++網絡API,所以我選擇了asio。現在,我已成功連接並寫入套接字,但由於我正在使用異步讀/寫,因此我需要一種跟蹤請求的方法(如果您願意,可以使用某種ID)。我查看過文檔/參考資料,但是我發現沒有辦法將用戶數據傳遞給我的處理程序,我能想到的唯一選擇是創建一個特殊的類作爲回調並跟蹤它的id,然後傳遞它作爲回調到套接字。有沒有更好的辦法?或者是做到這一點的最佳方式?異步寫入套接字和用戶值(boost :: asio問題)

回答

3

async_xxx函數模板化完成處理程序的類型。該處理程序不必是簡單的「回調」,它可以是任何公開正確的operator()簽名的東西。

你應該這樣能夠做這樣的事情:

// Warning: Not tested 
struct MyReadHandler 
{ 
    MyReadHandler(Whatever ContextInformation) : m_Context(ContextInformation){} 

    void 
    operator()(const boost::system::error_code& error, std::size_t bytes_transferred) 
    { 
     // Use m_Context 
     // ...    
    } 

    Whatever m_Context; 
}; 

boost::asio::async_read(socket, buffer, MyReadHander(the_context)); 

或者,你也可以有你的處理程序作爲一個普通的功能,並在調用點綁定它,如asio tutorial描述。上面的例子將是:

void 
HandleRead(
    const boost::system::error_code& error, 
    std::size_t bytes_transferred 
    Whatever context 
) 
{ 
    //... 
} 

boost::asio::async_read(socket, buffer, boost::bind(&HandleRead, 
    boost::asio::placeholders::error_code, 
    boost::asio::placeholders::bytes_transferred, 
    the_context 
)); 
+0

謝謝!這工作完美。 – fingerprint211b 2010-01-22 16:51:43