2011-05-22 45 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