boost :: asio :: async_read texutal停止条件?

时间:2011-03-10 11:06:16

标签: c++ visual-studio-2008 boost-asio

我正在使用Boost编写服务器,非常简单 - 接受XML消息,处理,回复。但是我告诉它何时停止阅读我遇到了麻烦。

这就是我现在所拥有的:( _index是读取数据的缓冲区)

std::size_t tcp_connection::completion_condition(const boost::system::error_code& error, 
std::size_t bytes_transferred)
{
    int ret = -1;
    std::istream is(&_index);
    std::string s;
    is >> s;

    if (s.find("</end_tag>") != std::string.npos) ret = 0;
    return ret;
}


void tcp_connection::start()
{
    // Get index from server 
    boost::asio::async_read(_socket, _index, &(tcp_connection::completion_condition), 
        boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));   
}

这不编译,因为我必须将completion_condition定义为static以将其传递给async_read;我不能将_index定义为静态,因为(显然)我需要它来特定于类。

是否有其他方法可以为completion_condition提供参数?如何让它识别结束标记并调用读取处理程序?

1 个答案:

答案 0 :(得分:2)

您可以将指针传递给成员函数。使用C ++执行此操作的语法很棘手,但boost::bind隐藏了它并使其相当容易。

一个示例是completion_condition 非静态并将其传递给async_read,如下所示:boost::bind(&tcp_connection::completion_condition, this, _1, _2)

&tcp_connection::completion_condition是指向该函数的指针。 this是类型tcp_connection的对象,用于调用函数。 _1_2是占位符;它们将被调用函数的两个参数替换。