2011-05-22 138 views
2
bool Connection::Receive(){ 
    boost::shared_ptr<std::string> buffer(new std::string()); 

    socket_.async_receive(boost::asio::buffer(*buffer), boost::bind(&Connection::handler, this, 
     boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

    //std::cout<<buffer<<std::endl; 

    int recvlen = buffer->length(); 
    if (recvlen <= 0) { 
     return false; 
    } 
    //this->OnReceived(buffer, recvlen); 
    return true; 
} 

錯誤:不能從 '常量的boost :: ASIO :: const_buffers_1' 轉換爲 '提高:: ASIO :: mutable_buffer'

Error 1 error C2440: '<function-style-cast>' : cannot convert from 'const boost::asio::const_buffers_1' to 'boost::asio::mutable_buffer' e:\boost_1_46_1\boost_1_46_1\boost\asio\detail\buffer_sequence_adapter.hpp 211 
+1

這個問題爲什麼被拒絕投票? – 2011-05-22 13:28:53

回答

3

async_receive功能需要改變緩衝區的內容,但你不能改變一個常量緩衝區。使用mutable_buffer而不是常量緩衝區。你可以找到一些信息here

你需要傳遞一個指針和大小設置爲可變的緩衝區:

std::vector<char> content_buffer(max_buffer_size); 

... boost::asio::mutable_buffer(content.data(), content.size()) ... 

它,你在全球範圍內宣佈你content_buffer是很重要的,bacause的async_receive功能是訪問緩衝區異步。如果您在函數中聲明緩衝區,則在數據收到之前它會超出範圍。

+3

這個答案很好,但不完全正確。傳遞給'async_receive'的緩衝區不需要在全局範圍內聲明。它不應該有自動存儲時間,但動態存儲時間就好了。在OP的問題中使用的示例中,緩衝區的生命週期由'shared_ptr'管理的問題只要在異步操作的生命週期內保持在作用域內,就可以工作。這可以通過將'shared_ptr'作爲參數傳遞給綁定完成函數來實現。 – 2011-05-22 13:37:00

+0

@Sam Miller thnx爲你提供幫助:) – Abanoub 2011-05-22 14:02:39

+0

你爲什麼要鏈接到非增強相關網站?爲什麼不給出正確的鏈接:http://www.boost.org/doc/libs/1_46_1/您的網站上是否存在某種惡意軟件? – 2011-05-22 23:38:31