2011-03-10 76 views
0

我正在用Boost编写服务器,非常简单 - 接受XML消息,处理,回复。但是我在告诉它什么时候停止阅读时遇到了麻烦。boost :: asio :: async_read texutal停止条件?

这就是我现在所拥有的:(_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静态通过它来async_read ;我无法将_index定义为静态的,因为(显然)我需要它是针对该类的。

有没有其他的方法给参数completion_condition?我如何才能识别结束标签并调用阅读处理程序?

回答

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是占位符;它们将被函数调用的两个参数替换。

相关问题