2011-05-31 33 views
-2
bool Connection::Receive(){ 
    std::vector<uint8_t> buf(1000); 
    boost::asio::async_read(socket_,boost::asio::buffer(buf,1000), 
      boost::bind(&Connection::handler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); 

    int rcvlen=buf.size(); 
    ByteBuffer b((std::shared_ptr<uint8_t>)buf.data(),rcvlen); 
    if(rcvlen <= 0){ 
     buf.clear(); 
     return false; 
    } 
    OnReceived(b); 
    buf.clear(); 
    return true; 
} 

该方法工作正常,但只有当我在它内部制造一个断点时。等待接收的时机是否存在问题?没有断点,就没有收到任何东西。我是否在加速asio async_read中获得竞争条件?

+0

我不明白你的问题。尝试使用','或'。'例如... – nabulke 2011-05-31 05:59:30

+0

@nabulke现在检查它 – Abanoub 2011-05-31 06:05:31

+5

请不要使用俚语。 “如此奇怪”不是一个问题,“w8ting”不是一个真正的单词。这不是一个论坛。 – Soviut 2011-05-31 06:22:24

回答

4

您正尝试在启动异步操作后立即从接收缓冲区中读取数据,而无需等待完成,这就是为什么当您设置断点时它会工作。

您的async_read之后的代码属于Connection::handler,因为这是您告知async_read在接收到某些数据后调用的回调。

你通常想要的是一个start_readhandle_read_some功能:

void connection::start_read() 
{ 
    socket_->async_read_some(boost::asio::buffer(read_buffer_), 
     boost::bind(&connection::handle_read_some, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
} 

void connection::handle_read_some(const boost::system::error_code& error, size_t bytes_transferred) 
{ 
    if (!error) 
    { 
     // Use the data here! 

     start_read(); 
    } 
} 

注意shared_from_this,如果你希望你的连接的生命周期由优秀我的号码被自动的照顾是很重要的/ O请求。请务必从boost::enable_shared_from_this<connection>派生出你的课程,并且只能用make_shared<connection>来创建它。

要实施这个,你的构造应该是私有的,你可以添加好友声明(的C++ 0x版本;如果你的编译器不支持此功能,你必须填上自己的论点正确的号码):

template<typename T, typename... Arg> friend boost::shared_ptr<T> boost::make_shared(const Arg&...); 

还要确保您的接收缓冲区在回调被调用时仍然存在,最好是通过使用连接类的静态大小缓冲区成员变量。

+0

@xDD它给了我这个错误'tr1 :: bad_weak_ptr' – Abanoub 2011-05-31 07:02:44

+0

确保你没有在构造函数中使用'shared_from_this()',因为那时不是所有东西都被设置好了。您可能想要创建一个公共静态帮助函数,该函数使用'make_shared'创建一个连接,然后调用'start_read()'。 – xDD 2011-05-31 07:05:46

+0

@xDD看我有三类检查他们你也会明白我试图做 连接 http://pastebin.com/zWQHVgSp 连接工厂 http://pastebin.com/fyx4eZdZ 服务器 HTTP: //pastebin.com/3DAcH7Db 我不知道如何让它工作,你告诉我:/ – Abanoub 2011-05-31 07:22:12