我正在使用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提供参数?如何让它识别结束标记并调用读取处理程序?
答案 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
是占位符;它们将被调用函数的两个参数替换。